线程concurrent包(Lock 與 Condition)

原创 2012年03月22日 11:09:35

synchronized和java.util.concurrent.locks.Lock的异同

主要相同点:
Lock能完成synchronized所实现的所有功能,在synchronized中隱含著物件鎖定與釋放鎖定的觀念

主要不同点:
Lock有比synchronized更精确的线程语义和更好的性能 synchronized会自动释放锁.而Lock一定要求程序员手工释放.并且必须在finally从句
中释放

 

Lock 與 Condition
對於初學者來說,執行緒的同步化 並非是個容易理解的議題,在synchronized中隱含著物件鎖定與釋放鎖定的觀念,程式中並沒有明顯的語意來告知這一點,而必須靠程式設計人員本身記憶物件的鎖定與釋放鎖定問題。
在java.util.concurrent.locks套件中新增了Lock與Condition等類別,可以讓您明確的在程式中進行明確的鎖定與釋放鎖定。
Lock是一個介面,其中規範了lock()、unclock()與newCondition()三種方法:

  lock()  用來取得物件的鎖定。

  unlock()  用來釋放物件的鎖定,通常由同一個Lock物件來呼叫lock()與unlock()。

  newCondition()  建立一個與Lock物件相關聯的Conditon物件。

Condition是一個介面,作用是在執行緒之間進行溝通,就如其名稱所示,告知執行緒目前的狀況為何,是要等待?還是通知?其規範的幾個重要方法為:

await()  告知目前的執行緒等待,直到被通知或中斷(interrupted)。

signal()  通知目前等待中的一個執行緒,從上次的等待點繼續執行,類似物件的notify()方法

signalAll()  通知目前等待中的所有執行緒參與鎖定競爭,而後從上次的等待點繼續執行,類似物件的notifyAll()方法。

在這邊直接改寫wait ()、notify() 中的Clerk類別,不使用synchronized、wait()、notify(),而改用Lock與Condition,其中ReentrantLock為Lock介面的一個實作類別:

Clerk.java

import java.util.concurrent.locks.*;
public class Clerk {
    private Lock lock = new ReentrantLock();
    private Condition threadCond = lock.newCondition();
// -1 表示目前沒有產品
private int product = -1; 
// 這個方法由生產者呼叫
public void setProduct(int product) { 
lock.lock();
try {
if(this.product != -1) { 
try { 
// 目前店員沒有空間收產品,請稍候!
threadCond.await();
} 
catch(InterruptedException e) { 
e.printStackTrace(); 
} 
} 
this.product = product; 
System.out.printf("生產者設定 (%d)%n", this.product); 
// 通知等待區中的一個消費者可以繼續工作了
threadCond.signal();
}
finally {
   lock.unlock();
}
} 
// 這個方法由消費者呼叫
public int getProduct() { 
lock.lock();
int p = 0;
try {
if(this.product == -1) { 
try { 
// 缺貨了,請稍候!
 threadCond.await();
} 
catch(InterruptedException e) { 
e.printStackTrace(); 
} 
} 
p = this.product; 
System.out.printf(
"消費者取走 (%d)%n", this.product); 
this.product = -1; 
// 通知等待區中的一個生產者可以繼續工作了
threadCond.signal();

}

finally {

            lock.unlock();

}

return p; 

} 

} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java多线程学习笔记——concurrent包的一些类(Lock 和Condition)

1、ReentrantLock类API介绍 一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。 Reentr...

java:lock中使用多个condition实现通知特定线程

相对于synchronized块中使用notify或者notifyall,通知的线程都是不确定的,当发一个通知,并不知道 下一个竞争到所得会是哪个线程。 而lock更加细腻,通过多个conditi...
  • anLA_
  • anLA_
  • 2017年04月13日 16:49
  • 391

线程并发之Lock and Condition

Lock and Condition   Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效...

多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】

---------------------------------------- android培训、java培训、期待与您交流! --------------------------------...

Java 多线程(四)线程间的通信jdk1.5中Lock,Condition----各种锁的相关详细概念

一.java.util.concurrent.locks包下常用的类   下面我们就来探讨一下java.util.concurrent.locks包中常用的类和接口。   1.Lock ...

多线程 : 使用Lock 和 Condition 实现线程间互斥与通信

package thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock...

Java线程---锁机制:synchronized、Lock、Condition

1.synchronized—对象加锁synchronized方法包括两种,一是标注了synchronized关键字的方法,一种是synchronized代码块.而不论是同步代码块还是同步方法都具有了...

java线程 使用显示的lock 和condition

java线程 使用显示的lock 和condition

java线程通讯——使用Lock和Condition代替synchronized 和 wait, notify notifyAll()

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。 此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。 ...

Lock和Condition实现线程通信(附阻塞队列的实例)

第一种情况:就使用单个Condition对象实现通信,方式同wait()和notify()   condition是await()和signal(),其中condition对象是通过lock.get...
  • com360
  • com360
  • 2011年09月21日 17:22
  • 3896
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程concurrent包(Lock 與 Condition)
举报原因:
原因补充:

(最多只允许输入30个字)