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高階-執行緒同步lock與unlock使用Java執行緒
- 執行緒同步及執行緒鎖執行緒
- Java執行緒:執行緒的同步與鎖Java執行緒
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- java多執行緒–同步鎖Java執行緒
- Java多執行緒/併發06、執行緒鎖Lock與ReadWriteLockJava執行緒
- 執行緒同步與互斥:互斥鎖執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- 多執行緒與併發-----Lock鎖技術執行緒
- Python並行程式設計(二):多執行緒鎖機制利用Lock與RLock實現執行緒同步Python並行行程程式設計執行緒
- 執行緒同步C#關鍵字:lock,monitor執行緒C#
- 《Java 高階篇》七:執行緒和執行緒池Java執行緒
- Java執行緒狀態及同步鎖Java執行緒
- .NET中各種執行緒同步鎖執行緒
- JUC執行緒高階---執行緒控制通訊Condition執行緒
- Java多執行緒學習(六)Lock鎖的使用Java執行緒
- java 執行緒淺解03[執行緒同步以及經典死鎖]Java執行緒
- Java執行緒池和Spring非同步處理高階篇Java執行緒Spring非同步
- JavaThread多執行緒同步、鎖、通訊Javathread執行緒
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- 簡單的執行緒同步問題:兩個執行緒交替執行N次【Synchronized、Lock、ArrayBlockingQueue】執行緒synchronizedBloC
- java執行緒安全LockJava執行緒
- @Java | Thread & synchronized – [ 執行緒同步鎖 基本使用]Javathreadsynchronized執行緒
- 執行緒關鍵字、鎖、同步集合筆記執行緒筆記
- c#執行緒-執行緒同步C#執行緒
- 執行緒同步執行緒
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- 大資料之執行緒高階部分大資料執行緒
- Java 高階 --- 多執行緒快速入門Java執行緒
- JavaSE高階程式設計之多執行緒Java程式設計執行緒
- java執行緒同步:synchronized關鍵字,Lock介面以及可重Java執行緒synchronized
- Java多執行緒(2)執行緒鎖Java執行緒
- java 執行緒安全問題,解決執行緒安全問題——同步程式碼塊,同步方法,Lock鎖,Object類中wait方法,notify方法。等待喚醒案例。Java執行緒ObjectAI
- 多執行緒和多執行緒同步執行緒
- 多執行緒非同步安全,安全鎖的問題執行緒非同步
- java執行緒學習5——執行緒同步之同步方法Java執行緒