线程的同步
线程的同步
线程同步
- 同步的方式,解决了线程安全的问题。
- 操作同步代码只有一个此线程参与,其他线程等待,相当于单线程,效率低。
方式一:同步代码块
synchronized(同步监视器){
//需要被同步的代码,操作共享数据的代码即为需要被同步的代码
}
- 共享数据
多个线程共同操作的变量 - 同步监视器
俗称:锁,任何一个对象都可以充当锁。要求:多个线程必须共用一把锁。方式二:同步方法
如果操作共享数据的代码在一个方法中,我们可以把该方法声明为同步的。
方式三:Lock(锁)
- 使用接口lock的子类ReentrantLock类的实例
//实例化ReentrantLock类
ReentrantLock lock = new ReentrantLock();
//加锁
lock.lock();
//待同步的代码
//解锁
lock.unlock();
经典面试题:synchronized与lock的区别
- 相同点:
- 都用来解决线程安全问题
- 不同点:
- lock需要再调用一次unlock
死锁
- lock需要再调用一次unlock
当两个线程都持有对方正在等待的锁就会出现死锁问题。
释放锁的操作
- 释放锁的操作
- 同步代码执行完毕
- 遇到break、return终止
- 出现异常、没有处理
- wait()、join()
- 不释放锁的操作
- sleep()和yield()方法 2. ```