日期:2014-05-20  浏览次数:20663 次

java 多线程在竞争一个内部锁时,只有一个线程获得锁,其它线程状态是什么?
java多线程竞争一个内部锁,只有一个线程获得锁,其它线程的状态是什么?wait? 线程阻塞状态到底是什么状态呢?

------解决方案--------------------
多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一个线程。当A希望进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立刻将门锁上,于是B,C,D...就不得不在门外等待,直到A释放锁出来后,B,C,D...中的某一人抢到了该锁(具体抢法依赖于JVM的实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。 

Java语言规范内置了对多线程的支持。对于Java程序来说,每一个对象实例都有一把“锁”,一旦某个线程获得了该锁,别的线程如果希望获得该锁,只能等待这个线程释放锁之后。获得锁的方法只有一个,就是synchronized关键字。例如: 

public class SharedResource { 
private int count = 0; 

public int getCount() { return count; } 

public synchronized void setCount(int count) { this.count = count; } 



同步方法public synchronized void setCount(int count) { this.count = count; } 事实上相当于: 

public void setCount(int count) { 
synchronized(this) { // 在此获得this锁 
this.count = count; 
} // 在此释放this锁 


红色部分表示需要同步的代码段,该区域为“危险区域”,如果两个以上的线程同时执行,会引发冲突,因此,要更改SharedResource的内部状态,必须先获得SharedResource实例的锁。 

退出synchronized块时,线程拥有的锁自动释放,于是,别的线程又可以获取该锁了。 

为了提高性能,不一定要锁定this,例如,SharedResource有两个独立变化的变量: 

public class SharedResouce { 
private int a = 0; 
private int b = 0; 

public synchronized void setA(int a) { this.a = a; } 

public synchronized void setB(int b) { this.b = b; } 


若同步整个方法,则setA()的时候无法setB(),setB()时无法setA()。为了提高性能,可以使用不同对象的锁: 

public class SharedResouce { 
private int a = 0; 
private int b = 0; 
private Object sync_a = new Object(); 
private Object sync_b = new Object(); 

public void setA(int a) { 
synchronized(sync_a) { 
this.a = a; 



public synchronized void setB(int b) { 
synchronized(sync_b) { 
this.b = b;