Java笔记-ReadWriteLock与Condition的使用
生活随笔
收集整理的這篇文章主要介紹了
Java笔记-ReadWriteLock与Condition的使用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ReentrantLock保證了只有一個(gè)線程可以執(zhí)行臨界區(qū)代碼。
允許多個(gè)線程同時(shí)讀,但只有一個(gè)線程在寫,其他線程就必須等待。
?
使用ReadWriteLock可以解決:
只允許一個(gè)線程寫入(其他線程既不能寫入也不能讀取)
沒有寫入時(shí),多個(gè)線程允許同時(shí)讀(提高性能)
程序運(yùn)行截圖如下:
源碼如下:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;class Counter{private ReadWriteLock lock = new ReentrantReadWriteLock();private Lock rlock = lock.readLock();private Lock wlock = lock.writeLock();private int value = 0;public void add(int m){wlock.lock();try{this.value += m;}finally {wlock.unlock();}}public void dec(int m){wlock.lock();try{this.value -= m;}finally {wlock.unlock();}}public int get(){rlock.lock();try{return this.value;}finally {System.out.println("Count get Finally");rlock.unlock();}} }public class Main1 {final static int LOOP = 100;public static void main(String[] args) throws InterruptedException {final Counter counter = new Counter();Thread t1 = new Thread(){@Overridepublic void run() {for(int i = 0; i < LOOP; i++){counter.add(1);}}};Thread t2 = new Thread(){@Overridepublic void run() {for(int i = 0; i < LOOP; i++){counter.dec(1);}}};t1.start();t2.start();t1.join();t2.join();System.out.println("COUNTER: " + counter.get());} }condition中的:
await/signal/signalAll和wait/notify/notifyAll一樣。
await()會(huì)釋放當(dāng)前鎖,進(jìn)入等待狀態(tài)。
signal()會(huì)喚醒某個(gè)等待線程
signalAll()會(huì)喚醒所有等待線程
喚醒線程從await()返回后需要重新獲得:
?
程序運(yùn)行截圖如下:
源碼如下:
import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;class TaskQueue{final Queue<String> queue = new LinkedList<String>();final Lock lock = new ReentrantLock();final Condition notEmpty = lock.newCondition();public String getTask() throws InterruptedException {lock.lock();try{while(this.queue.isEmpty()){notEmpty.await();}return queue.remove();}finally {lock.unlock();}}public void addTask(String name){lock.lock();try{this.queue.add(name);notEmpty.signalAll();}finally {lock.unlock();}} }class WorkerThread extends Thread{TaskQueue taskQueue;public WorkerThread(TaskQueue taskQueue){this.taskQueue = taskQueue;}@Overridepublic void run() {while (!isInterrupted()){String name = "";try{name = taskQueue.getTask();}catch (InterruptedException e) {break;}String result = "HELLO, " + name + " !";System.out.println(result);}} }public class Main2 {public static void main(String[] args) throws InterruptedException {TaskQueue taskQueue = new TaskQueue();WorkerThread workerThread = new WorkerThread(taskQueue);workerThread.start();taskQueue.addTask("小明");Thread.sleep(1000);taskQueue.addTask("小紅");Thread.sleep(1000);taskQueue.addTask("小剛");Thread.sleep(1000);workerThread.interrupt();workerThread.join();System.out.println("END");} }?
總結(jié)
以上是生活随笔為你收集整理的Java笔记-ReadWriteLock与Condition的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt实践|HTTP知识点-使用百度AI语
- 下一篇: Qt文档阅读笔记-Qt工作笔记-QTab