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