同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

同步:发送一个指令,需要等待返回结果,才能发出下一个指令,需要等待;

异步:发送一个指令,不需要等待,即可直接发出下一个指令;

一般情况下,都采用异步,效率更高;但是比如说银行系统,必须采用同步,这样才能保证数据的共享和安全性;

 

synchronize关键字:

每个 synchronized 方法都必须获得调用该方法的类实例的锁(或者类锁)方能执行,否则所属线程阻塞;直到synchronize方法结束后,才会释放锁;所有声明synchronize的方法中只有一个在调用;避免了类中的成员变量的访问冲突;

记住:只要锁的是不同的锁,就会导致无法同步;怎样才是不同的锁呢?

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

4.同步方法块的括号里是类名.class,锁就是当前类的class 对象

 

1.一个类的类锁就只有一个,所以一个类的锁都是相同的

2.一个类中的对象锁有很多个,一个类的对象锁互不相同;

3.类锁和对象锁互不相同;

 

对象锁:

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

 对象锁举例:

 同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

 

 

类锁(下面两种实现方法):

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

由于用的是同一个类锁,锁住的东西是相同的,所以有下面的结果

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

 

但如果一个锁住的是类,一个锁住的是对象的话,如下:

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

操作的是不同的锁,所以会有下面的结果:

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

 

 

下面一个例子采用了同步锁,来对实例方法进行同步,即构造两个线程,往其中都加入一个含有同步实例方法的对象

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

 

(Android中创建子线程来写耗时逻辑)单线程的暂停和开始可以在线程中放入一个flag,通过这个flag来对线程进行控制。

 

多线程暂停和开始 :

  暂停用interrupt(其实也可以用flag控制)不用已淘汰的stop,注意interrupt只是判断线程是否暂停,在线程的run方法中抛出异常(一定要调用一下interrupt方法,才能进行interrupt判断) 或者用break但是(在for循环中  break之后for还是会接着执行),所以尽量用interrupt       

  恢复就是相对暂停来写逻辑,和上述一样

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify

 

 

1.新建状态:new Thread(r);

2.就绪状态:调用start()方法,但不一定立即执行run()方法,还需和其他线程竞争CPU时间,才能进入运行状态;

3.运行状态:调用run()方法;

4.阻塞状态:多种原因:①。通过调用Sleep()方法进入睡眠

                                  ②.线程正在等待触发条件;

5.死亡状态:①run方法正常结束导致线程死亡

                    ②.未捕获异常终止了run方法导致线程猝死;

                     可调用isAlive查看线程是否死亡,return true是出于运行或者阻塞状态,return false是出于死亡状态;

 

sleep和wait方法的区别是,sleep不会放弃对象的监视器,wait会放弃对象的监视器

 

线程沉睡和唤醒用wait和notify方法。(都在synchronize中使用,而synchronize一般都是在线程中的某个方法用的,因为为了同步线程,所以是一个Thread对象创建出多个threadA,B...引用 来调用这个线程方法)

注意线程的上述方法和Object自带的wait()和notifyAll()方法的区别,wait()和notifyAll()一定要在synchronize同步语句中添加,因为调用这两个方法一定要获得对象锁,synchronize块就是为了获取锁,有synchronize块的线程处于运行状态,没有它的线程则处于阻塞状态;

调用wait时,会将对象锁放弃;之后其他线程均分机会来获取这个锁