6.JUC執行緒高階-Lock同步鎖
1. 解決多執行緒安全問題的方式:
- 同步程式碼塊
synchronized(this) {
}
- 同步方法
public synchronized void method() {
}
public static synchronized void method() {
}
JDK1.5之前才使用上述兩種方式藉助於:synchronized 隱式鎖
。之後出現一個新的顯示同步鎖
- 同步鎖 Lock
顯示鎖
顯示鎖:必須通過 lock() 方法上鎖,通過 unlock() 方法進行釋放鎖
此種方式是一種更加靈活更加高階處理執行緒安全問題的方式,但它也存在一定的不足,需要手動(finally)釋放鎖。
下面使用賣票例項來模擬 Lock鎖的使用:
package com.pyy.juc;
public class TestLock {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1號視窗").start();
new Thread(ticket, "2號視窗").start();
new Thread(ticket, "3號視窗").start();
}
}
class Ticket implements Runnable {
private int tick = 100;
@Override
public void run() {
while(true) {
if(tick > 0) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 完成售票,餘票為:" + --tick);
}
}
}
}
結果: 出現多個視窗賣同一張票的情況
...
2號視窗 完成售票,餘票為:24
1號視窗 完成售票,餘票為:23
2號視窗 完成售票,餘票為:22
3號視窗 完成售票,餘票為:22
1號視窗 完成售票,餘票為:21
3號視窗 完成售票,餘票為:20
2號視窗 完成售票,餘票為:19
...
下面使用同步鎖Lock- ReenTrantLock實現:
package com.pyy.juc;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "1號視窗").start();
new Thread(ticket, "2號視窗").start();
new Thread(ticket, "3號視窗").start();
}
}
class Ticket implements Runnable {
private int tick = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while(true) {
lock.lock();// 加鎖
try {
if(tick > 0) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 完成售票,餘票為:" + --tick);
}
} finally {
lock.unlock();// 釋放鎖
}
}
}
}
結果不會出現執行緒安全問題。
相關文章
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- Python並行程式設計(二):多執行緒鎖機制利用Lock與RLock實現執行緒同步Python並行行程程式設計執行緒
- 執行緒同步與互斥:互斥鎖執行緒
- 多執行緒與併發-----Lock鎖技術執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- .NET中各種執行緒同步鎖執行緒
- Java執行緒狀態及同步鎖Java執行緒
- Java多執行緒學習(六)Lock鎖的使用Java執行緒
- 《Java 高階篇》七:執行緒和執行緒池Java執行緒
- JUC執行緒高階---執行緒控制通訊Condition執行緒
- Java執行緒池和Spring非同步處理高階篇Java執行緒Spring非同步
- java 執行緒淺解03[執行緒同步以及經典死鎖]Java執行緒
- @Java | Thread & synchronized – [ 執行緒同步鎖 基本使用]Javathreadsynchronized執行緒
- java 執行緒安全問題,解決執行緒安全問題——同步程式碼塊,同步方法,Lock鎖,Object類中wait方法,notify方法。等待喚醒案例。Java執行緒ObjectAI
- java執行緒同步:synchronized關鍵字,Lock介面以及可重Java執行緒synchronized
- 執行緒關鍵字、鎖、同步集合筆記執行緒筆記
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- 多執行緒和多執行緒同步執行緒
- 大資料之執行緒高階部分大資料執行緒
- JavaSE高階程式設計之多執行緒Java程式設計執行緒
- Java 高階 --- 多執行緒快速入門Java執行緒
- 執行緒與同步非同步執行緒非同步
- 多執行緒_鎖執行緒
- 執行緒鎖(四)執行緒
- 執行緒同步方法執行緒
- 深入執行緒同步執行緒
- 執行緒的同步執行緒
- 理解執行緒同步執行緒
- 多執行緒,執行緒類三種方式,執行緒排程,執行緒同步,死鎖,執行緒間的通訊,阻塞佇列,wait和sleep區別?執行緒佇列AI
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 多執行緒中使用Lock鎖定多個條件Condition的使用執行緒
- Java核心(三)併發中的執行緒同步與鎖Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 執行緒和鎖,鎖升級執行緒