在多线程示例中提高并发性

时间:2013-03-19 14:20:25

标签: java multithreading

锁定机制 - 每个方法都运行一个队列,用于跟踪正在为该方法进行的进程内密钥。

    private final static Object LOCK = new Object();
    private final static Set<String> busy1Records = new HashSet<String>();
    private final static Set<String> busy2Records = new HashSet<String>();

    public void waitToWorkOn(int i, String key) {
        synchronized(LOCK) {

          switch(i) {
            case 1 : while (busy1Records.contains(key)) {
                        LOCK.wait(); //go to sleep
                     }
                     busy1Records.add(key);  
                     break;
            case 2 : while (busy2Records.contains(key)) {
                     LOCK.wait(); //go to sleep
                     }
                     busy2Records.add(key);  
                     break;
          }//end switch

       } // end sychronized                    
    }


    public void doneWith(int i, String key) {
        synchronized(LOCK) {

        switch(i) { 

          case 1:
              busy1Records.remove(key);
              LOCK.notifyAll(); 
              break;
          case 2:
              busy2Records.remove(key);
              LOCK.notifyAll(); 
              break;

        }

要使用这些集,该类中有这些方法。

private void method1(String key) {

try {

waitToWorkOn(1,key);
// Do stuffs here for key   

}catch(Exception e)  {..}
finally {
doneWith(1,key);
}

}

private void method2(String key) {

try {

waitToWorkOn(2,key);    
// Do stuffs here for key

}catch(Exception e)  {..}
finally {
doneWith(2,key);
}

}

考虑有3个线程[每个线程适用于此类的新实例]

T1 - key = X
T2 - key = X
T3 - key = Z

因此,当T1在method1中时,它获取LOCK并为其方法1的队列添加密钥并释放LOCK。但它尚未调用doneWith方法,然后另一个线程T2尝试插入相同的实体X.因此它在waitToWorkON中获取LOCK,因为它已经在Queue1中找到X,所以它必须在内部等待。然后一个线程T3必须在第三个实体Z上调用method1,它独立于X.但是由于T2正在等待并保持LOCK,它将无法获取LOCK。

如何让T3继续使用method1 for Z而不等待T2在那里等待? T1仍然没有从队列中释放X​​.

1 个答案:

答案 0 :(得分:0)

感谢@Hamlet和@assylias的答案

  

@fortm LOCK.wait()释放锁定,等待返回时重新获取。所以是的,如果线程1正在等待,则线程2可以进入同步块。 - assylias 21分钟前   1投票

     

好的,我明白你想要达到的目标。是的,当锁定呼叫等待时,   它释放锁,线程进入等待队列,直到它   信号。之后,线程移动到就绪队列并等待到   重新获得锁定。 - Hamlet Hakobyan 2分钟前