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

解决方案 »

  1.   

    就是进入一个用于存放等待中的线程的队列。在Lock机制中,应该就是wait动作了。
      

  2.   

    http://webservices.ctocio.com.cn/java/423/9092423.shtml
      

  3.   

    多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每个人都是一个线程。当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; 
            } 
        }