java解决线程同步问题
synchronized机制与lock机制
synchronized机制
1.同步代码块
synchronized(obj){
//obj为同步监视器,即锁
//括号内部放置访问共享的代码段
//如果多线程采用实现Runable接口方式,obj可以为this对象
//如果多线程采用继承Thread类方式,obj可以是当前类的**.class对象
}
2.同步方法
public synchronized void func(){
//同步方法仍然涉及同步监视器,不过是隐式的
//如果多线程采用实现Runable接口方式,则同步监视器为this对象
/*如果多线程采用继承Thread类方式,则同步监视器为当前类**.class对象,
且同步方法必须声明为static方法*/
}
tips:
synchronized机制必须共用同一把锁。
synchronized包含的范围要尽可能合适,范围太大不能发挥多线程优势,范围太小不能锁住所有有安全问题的代码。
lock机制
java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的
工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象
加锁,线程开始访问共享资源之前应先获得Lock对象。
ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和
内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以
显式加锁、释放锁。
(1)实例化ReentrantLock类;
(2)调用实例对象的lock();
(3)调用实例对象的unlock()
synchronized机制与lock机制的比较
- 相同:二者都可以解决线程安全问题
- 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器,Lock需要手动的启动同步(lock(),同时结束同步也需要手动的实现(unlock())
两种方式的选择
Lock ==> 同步代码块 ==> 同步方法