摘要:賣票案例出現了線程安全問題賣出了不存在的票和重復的票解決線程安全問題的三種方案使用鎖接口實現提供了比使用方法和語句可獲得的更廣泛的鎖定操作。接口中的方法獲取鎖。
package com.itheima.demo09.Lock;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
賣票案例出現了線程安全問題 賣出了不存在的票和重復的票 解決線程安全問題的三種方案:使用Lock鎖 java.util.concurrent.locks.Lock接口 Lock 實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。 Lock接口中的方法: void lock()獲取鎖。 void unlock() 釋放鎖。 java.util.concurrent.locks.ReentrantLock implements Lock接口 使用步驟: 1.在成員位置創建一個ReentrantLock對象 2.在可能會出現安全問題的代碼前調用Lock接口中的方法lock獲取鎖 3.在可能會出現安全問題的代碼后調用Lock接口中的方法unlock釋放鎖
*/
public class RunnableImpl implements Runnable{
//定義一個多個線程共享的票源 private int ticket = 100; //1.在成員位置創建一個ReentrantLock對象 Lock l = new ReentrantLock(); //設置線程任務:賣票 @Override public void run() { //使用死循環,讓賣票操作重復執行 while(true){ //2.在可能會出現安全問題的代碼前調用Lock接口中的方法lock獲取鎖 l.lock(); //先判斷票是否存在 if(ticket>0){ //提高安全問題出現的概率,讓程序睡眠 try { Thread.sleep(10); //票存在,賣票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在賣第"+ticket+"張票"); ticket--; } catch (InterruptedException e) { e.printStackTrace(); }finally { //3.在可能會出現安全問題的代碼后調用Lock接口中的方法unlock釋放鎖 l.unlock();//無論程序是否異常,都會把鎖釋放 } } } } /*//設置線程任務:賣票 @Override public void run() { //使用死循環,讓賣票操作重復執行 while(true){ //2.在可能會出現安全問題的代碼前調用Lock接口中的方法lock獲取鎖 l.lock(); //先判斷票是否存在 if(ticket>0){ //提高安全問題出現的概率,讓程序睡眠 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,賣票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在賣第"+ticket+"張票"); ticket--; } //3.在可能會出現安全問題的代碼后調用Lock接口中的方法unlock釋放鎖 l.unlock(); } }*/
}
package com.itheima.demo09.Lock;
/*
模擬賣票案例 創建3個線程,同時開啟,對共享的票進行出售
*/
public class Demo01Ticket {
public static void main(String[] args) { //創建Runnable接口的實現類對象 RunnableImpl run = new RunnableImpl(); //創建Thread類對象,構造方法中傳遞Runnable接口的實現類對象 Thread t0 = new Thread(run); Thread t1 = new Thread(run); Thread t2 = new Thread(run); //調用start方法開啟多線程 t0.start(); t1.start(); t2.start(); }
}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75599.html
摘要:返回與此鎖相關聯的給定條件等待的線程數的估計。查詢是否有線程正在等待獲取此鎖。為公平鎖,為非公平鎖線程運行了獲得鎖定運行結果公平鎖的運行結果是有序的。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)synchronized關鍵字(2) Java多線程學習(三)volatile關鍵字 ...
摘要:運行可運行狀態的線程獲得了時間片,執行程序代碼。阻塞的情況分三種一等待阻塞運行的線程執行方法,會把該線程放入等待隊列中。死亡線程方法執行結束,或者因異常退出了方法,則該線程結束生命周期。死亡的線程不可再次復生。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關鍵字(1) java多線程學習(二)synchronized關鍵...
摘要:底層是是通過對象,對象有自己的對象頭,存儲了很多信息,其中一個信息標示是被哪個線程持有。當一個線程執行的代碼出現異常時,其所持有的鎖會自動釋放。 前言 回顧前面: 多線程三分鐘就可以入個門了! Thread源碼剖析 多線程基礎必要知識點!看了學習多線程事半功倍 只有光頭才能變強! 本文章主要講的是Java多線程加鎖機制,有兩種: Synchronized 顯式Lock 不得不嘮...
摘要:分布式鎖實現方式前言目前幾乎很多大型網站及應用都是分布式部署的,分布式場景中的數據一致性問題一直是一個比較重要的話題。基于數據庫實現分布式鎖基于緩存等實現分布式鎖基于實現分布式鎖。 前言 分布式鎖,是控制分布式系統之間同步訪問共享資源的一種方式 在分布式系統中,常常需要協調他們的動作。如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那么訪問這些資源的時候,往往需要互斥...
閱讀 1000·2021-11-22 13:52
閱讀 1441·2021-11-19 09:40
閱讀 3122·2021-11-16 11:44
閱讀 1263·2021-11-15 11:39
閱讀 3893·2021-10-08 10:04
閱讀 5333·2021-09-22 14:57
閱讀 3096·2021-09-10 10:50
閱讀 3177·2021-08-17 10:13