同步和异步的区别,线程同步锁,synchronize关键字;线程的控制方法,线程的五种状态,wait/notify
同步:发送一个指令,需要等待返回结果,才能发出下一个指令,需要等待;
异步:发送一个指令,不需要等待,即可直接发出下一个指令;
一般情况下,都采用异步,效率更高;但是比如说银行系统,必须采用同步,这样才能保证数据的共享和安全性;
synchronize关键字:
每个 synchronized 方法都必须获得调用该方法的类实例的锁(或者类锁)方能执行,否则所属线程阻塞;直到synchronize方法结束后,才会释放锁;所有声明synchronize的方法中只有一个在调用;避免了类中的成员变量的访问冲突;
记住:只要锁的是不同的锁,就会导致无法同步;怎样才是不同的锁呢?
4.同步方法块的括号里是类名.class,锁就是当前类的class 对象
1.一个类的类锁就只有一个,所以一个类的锁都是相同的
2.一个类中的对象锁有很多个,一个类的对象锁互不相同;
3.类锁和对象锁互不相同;
对象锁:
对象锁举例:
类锁(下面两种实现方法):
由于用的是同一个类锁,锁住的东西是相同的,所以有下面的结果
但如果一个锁住的是类,一个锁住的是对象的话,如下:
操作的是不同的锁,所以会有下面的结果:
下面一个例子采用了同步锁,来对实例方法进行同步,即构造两个线程,往其中都加入一个含有同步实例方法的对象
(Android中创建子线程来写耗时逻辑)单线程的暂停和开始可以在线程中放入一个flag,通过这个flag来对线程进行控制。
多线程暂停和开始 :
暂停用interrupt(其实也可以用flag控制)不用已淘汰的stop,注意interrupt只是判断线程是否暂停,在线程的run方法中抛出异常(一定要调用一下interrupt方法,才能进行interrupt判断) 或者用break但是(在for循环中 break之后for还是会接着执行),所以尽量用interrupt
恢复就是相对暂停来写逻辑,和上述一样
1.新建状态:new Thread(r);
2.就绪状态:调用start()方法,但不一定立即执行run()方法,还需和其他线程竞争CPU时间,才能进入运行状态;
3.运行状态:调用run()方法;
4.阻塞状态:多种原因:①。通过调用Sleep()方法进入睡眠
②.线程正在等待触发条件;
5.死亡状态:①run方法正常结束导致线程死亡
②.未捕获异常终止了run方法导致线程猝死;
可调用isAlive查看线程是否死亡,return true是出于运行或者阻塞状态,return false是出于死亡状态;
sleep和wait方法的区别是,sleep不会放弃对象的监视器,wait会放弃对象的监视器