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