java多執行緒–同步鎖
為了解決多執行緒安全問題
在 Java 5.0 之前,協調共享物件的訪問時可以使用的機制只有 synchronized 和 volatile 。
Java 5.0 後增加了一些新的機制,但並不是一種替代內建鎖的方法,而是當內建鎖不適用時,作為一種可選擇的高階功能。
隱式鎖
synchronized
- 同步程式碼塊;
- 同步方法。
顯示鎖 Lock
jdk 1.5 後:同步鎖 Lock 需要通過 lock() 方法上鎖,必須通過 unlock() 方法進行釋放鎖。
ReentrantLock 實現了 Lock 介面,並提供了與synchronized 相同的互斥性和記憶體可見性。但相較於synchronized 提供了更高的處理鎖的靈活性。
Lock使用方式:
Lock lock = new ReentrantLock(); lock.lock(); try { } finally { lock.unlock(); }
相關API:
- void lock() 獲取鎖。
- void lockInterruptibly() 如果當前執行緒未被中斷,則獲取鎖。
- Condition newCondition() 返回繫結到此 Lock 例項的新 Condition 例項。
- boolean tryLock() 僅在呼叫時鎖為空閒狀態才獲取該鎖。
- boolean tryLock(long time, TimeUnit unit) 如果鎖在給定的等待時間內空閒,並且當前執行緒未被中斷,則獲取鎖。
- void unlock()釋放鎖。
不使用鎖出現多執行緒安全問題demo:
package com.company; 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) { } System.out.println(Thread.currentThread().getName() + " 完成售票,餘票為:" + --tick); } } } }
看出現的問題(擷取結果中一部分):
3號視窗 完成售票,餘票為:10 1號視窗 完成售票,餘票為:8 2號視窗 完成售票,餘票為:8 3號視窗 完成售票,餘票為:8 2號視窗 完成售票,餘票為:7 1號視窗 完成售票,餘票為:7 3號視窗 完成售票,餘票為:7 1號視窗 完成售票,餘票為:6 2號視窗 完成售票,餘票為:5 3號視窗 完成售票,餘票為:4 3號視窗 完成售票,餘票為:3 1號視窗 完成售票,餘票為:3 2號視窗 完成售票,餘票為:3 3號視窗 完成售票,餘票為:2 1號視窗 完成售票,餘票為:0 2號視窗 完成售票,餘票為:1
現在我們用Lock來進行處理:
package com.company; 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) { try { lock.lock(); if (tick > 0) { try { Thread.sleep(200); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getName() + " 完成售票,餘票為:" + --tick); } } finally { lock.unlock(); } } } }
看下結果(當然也是一部分),很完美解決多執行緒安全問題:
2號視窗 完成售票,餘票為:20 2號視窗 完成售票,餘票為:19 2號視窗 完成售票,餘票為:18 2號視窗 完成售票,餘票為:17 2號視窗 完成售票,餘票為:16 2號視窗 完成售票,餘票為:15 2號視窗 完成售票,餘票為:14 2號視窗 完成售票,餘票為:13 2號視窗 完成售票,餘票為:12 2號視窗 完成售票,餘票為:11 2號視窗 完成售票,餘票為:10 2號視窗 完成售票,餘票為:9 2號視窗 完成售票,餘票為:8 2號視窗 完成售票,餘票為:7 2號視窗 完成售票,餘票為:6 2號視窗 完成售票,餘票為:5 2號視窗 完成售票,餘票為:4 2號視窗 完成售票,餘票為:3 2號視窗 完成售票,餘票為:2 2號視窗 完成售票,餘票為:1 2號視窗 完成售票,餘票為:0
相關文章
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- Java執行緒:執行緒的同步與鎖Java執行緒
- 多執行緒(2)-執行緒同步互斥鎖Mutex執行緒Mutex
- Java多執行緒(2)執行緒鎖Java執行緒
- java 多執行緒 –同步Java執行緒
- java 多執行緒 --同步Java執行緒
- 【Java】【多執行緒】同步方法和同步程式碼塊、死鎖Java執行緒
- Java多執行緒-無鎖Java執行緒
- 執行緒同步及執行緒鎖執行緒
- Java執行緒狀態及同步鎖Java執行緒
- Java多執行緒(五):死鎖Java執行緒
- java多執行緒(5)死鎖Java執行緒
- Java多執行緒7:死鎖Java執行緒
- 多執行緒和多執行緒同步執行緒
- JavaThread多執行緒同步、鎖、通訊Javathread執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決Java執行緒synchronized佇列
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 多執行緒_鎖執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- Java多執行緒 -- 公平鎖和非公平鎖Java執行緒
- 多執行緒同步執行緒
- JAVA多執行緒與鎖機制Java執行緒
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- java 執行緒淺解03[執行緒同步以及經典死鎖]Java執行緒
- @Java | Thread & synchronized – [ 執行緒同步鎖 基本使用]Javathreadsynchronized執行緒
- 多執行緒非同步安全,安全鎖的問題執行緒非同步
- 【java 多執行緒】多執行緒併發同步問題及解決方法Java執行緒
- Java—執行緒同步Java執行緒
- Java多執行緒5:synchronized鎖方法塊Java執行緒synchronized
- Java多執行緒4:synchronized鎖機制Java執行緒synchronized
- Java多執行緒——執行緒Java執行緒
- Java多執行緒同步工具類之SemaphoreJava執行緒
- Java多執行緒同步工具類之CountDownLatchJava執行緒CountDownLatch
- Java多執行緒同步工具類之CyclicBarrierJava執行緒
- Java 多執行緒同步的五種方法Java執行緒