多线程基础总结一--synchronized
2010-01-22 00:00:00 来源:WEB开发网我想因为没有synchronized让对象的隐式锁发挥作用,那么方法或者方法块内的线程在同一时间可能存在多个,假设wait()可用,它会把这些线程统统的加到wait set中等待被唤醒,这样永远没有多余的线程去唤醒它们。每个对象管理调用其wait(),notify()的线程,使得别的对象即使想帮忙也帮不上忙。这样的结果就是多线程永远完成不了多任务,基于此Java在设计时使其必须与synchronized一起使用,这样获得隐式锁的线程同一时间只有一个,当此线程被对象的wait()扔到wait set中时,线程会释放这个对象的隐式锁等待被唤醒的机会,这样的设计会大大降低死锁。另外同一个对象隐式锁作用下的多个方法或者方法块在没有锁的限制下可以同时允许多个线程在不同的方法内wait和notify,严重的竞争条件使得死锁轻而易举。所以Java设计者试图通过Monitor Object模式解决这些问题,每个对象都是Monitor用于监视拥有其使用权的线程。
但是synchronized这种获得隐式锁的方式本身也是有隐患问题的:a.不能中断正在试图获得锁的线程,b.试图获得锁时不能设定超时,c.每个锁只有一个条件太少。对于最后一项的设计前面提到的JDK5的方案是可以弥补的,一个ReentrantLock可以有多个Condition,每个条件管理获得对象锁满足条件的线程,通过await(),signalAll()使只关于Condition自己放倒的线程继续运行,或者放倒一些线程,而不是全部唤醒等等。但对于前两者的极端情况会出现死锁。下面的这个例子:
Java代码
class DeadLockSample{
public final Object lock1 = new Object();
public final Object lock2 = new Object();
public void methodOne(){
synchronized(lock1){
...
synchronized(lock2){...}
}
}
public void methodTwo(){
synchronized(lock2){
...
synchronized(lock1){...}
}
}
}
更多精彩
赞助商链接