Java中JDK1.5之后,出了另一种线程同步机制,通过显示定义同步锁来进行同步:
ReadWriteLock(读写锁):允许多个线程并发访问共享资源。
ReentrantLock(可重入锁):实现线程安全的控制,一般用这个。
使用lock对象可以显示实现 加锁、释放锁。
格式如下
class x{
//定义锁对象
private ReentrantLock lock= new ReentrantLock();
//需要保证线程安全的方法
public void run(){
//加锁
lock.lock();
try{
//保证线程安全的代码
……..
}
//一般使用finally释放锁
finally{
lock.unlock();
}
}
}
代码举例上面的Account类中,当多个线程并发执行draw方法的时候,一次只能有一个线程进行加锁...解锁操作,通过这样,我们来保证对共享资源的安全的操作!
说完了线程同步,我们这里来说一下,使用线程同步我们可能遇到的问题,线程死锁!
当两个线程互相等待对方释放同步监视器的时候就会发生死锁。(死锁不会报错,也不会异常,更不会提示,所有线程进入阻塞状态,无法继续)
当系统出现多个同步监视器的情况下,容易死锁,如下面的例子:
线程A 线程B 测试从运行结果来看,很明显,主线程进入A实例的eat方法时,准备调用B实例的speek()方法,子线程也进入了B实例的eat方法,准备调用A实例的speek()方法,但是主线程等待B实例试图获取同步监视器,子线程等待A实例试图获取同步监视器,由于各自线程执行都没有完成,所以无法释放同步监视器,造成了线程的死锁。
因此,我们在使用线程同步的时候,应当考虑到这个,避免线程死锁的问题出现。
网友评论