摘要:賣票案例出現(xiàn)了線程安全問(wèn)題賣出了不存在的票和重復(fù)的票解決線程安全問(wèn)題的一種方案使用同步代碼塊格式鎖對(duì)象可能會(huì)出現(xiàn)線程安全問(wèn)題的代碼訪問(wèn)了共享數(shù)據(jù)的代碼注意通過(guò)代碼塊中的鎖對(duì)象可以使用任意的對(duì)象但是必須保證多個(gè)線程使用的鎖對(duì)象是同一個(gè)鎖對(duì)象作
package com.itheima.demo07.Synchronized;
/*
賣票案例出現(xiàn)了線程安全問(wèn)題 賣出了不存在的票和重復(fù)的票 解決線程安全問(wèn)題的一種方案:使用同步代碼塊 格式: synchronized(鎖對(duì)象){ 可能會(huì)出現(xiàn)線程安全問(wèn)題的代碼(訪問(wèn)了共享數(shù)據(jù)的代碼) } 注意: 1.通過(guò)代碼塊中的鎖對(duì)象,可以使用任意的對(duì)象 2.但是必須保證多個(gè)線程使用的鎖對(duì)象是同一個(gè) 3.鎖對(duì)象作用: 把同步代碼塊鎖住,只讓一個(gè)線程在同步代碼塊中執(zhí)行
*/
public class RunnableImpl implements Runnable{
//定義一個(gè)多個(gè)線程共享的票源 private int ticket = 100; //創(chuàng)建一個(gè)鎖對(duì)象 Object obj = new Object(); //設(shè)置線程任務(wù):賣票 @Override public void run() { //使用死循環(huán),讓賣票操作重復(fù)執(zhí)行 while(true){ //同步代碼塊 synchronized (obj){ //先判斷票是否存在 if(ticket>0){ //提高安全問(wèn)題出現(xiàn)的概率,讓程序睡眠 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,賣票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在賣第"+ticket+"張票"); ticket--; } } } }
}
package com.itheima.demo07.Synchronized;
/*
模擬賣票案例 創(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://www.ezyhdfw.cn/yun/75606.html
摘要:線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。常量始終是線程安全的,因?yàn)橹淮嬖谧x操作。局部變量是線程安全的。有狀態(tài)對(duì)象,就是有實(shí)例變量的對(duì)象,可以保存數(shù)據(jù),是非線程安全的。 前言 有多少人在使用Spring框架時(shí),很多時(shí)候不知道或者忽視了多線程的問(wèn)題? ??因?yàn)閷懗绦驎r(shí),或做單元測(cè)試時(shí),很難有機(jī)會(huì)碰到多線程的問(wèn)題,因?yàn)闆](méi)有那么容易模擬多線程測(cè)試的環(huán)境。那么當(dāng)多個(gè)線程調(diào)用同一個(gè)bean的時(shí)...
摘要:線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。常量始終是線程安全的,因?yàn)橹淮嬖谧x操作。局部變量是線程安全的。有狀態(tài)對(duì)象,就是有實(shí)例變量的對(duì)象,可以保存數(shù)據(jù),是非線程安全的。 前言 有多少人在使用Spring框架時(shí),很多時(shí)候不知道或者忽視了多線程的問(wèn)題? ??因?yàn)閷懗绦驎r(shí),或做單元測(cè)試時(shí),很難有機(jī)會(huì)碰到多線程的問(wèn)題,因?yàn)闆](méi)有那么容易模擬多線程測(cè)試的環(huán)境。那么當(dāng)多個(gè)線程調(diào)用同一個(gè)bean的時(shí)...
摘要:線程操作共享數(shù)據(jù)的安全問(wèn)題線程操作共享數(shù)據(jù)的安全問(wèn)題如果有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。喚醒全部可以將線程池中的所有線程都喚醒。 01線程操作共享數(shù)據(jù)的安全問(wèn)題 *A:線程操作共享數(shù)據(jù)的安全問(wèn)題 如果有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。 程序每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的。 02...
摘要:前言文章介紹了單例模式五種實(shí)現(xiàn)的方式,分別是懶漢,餓漢,靜態(tài)內(nèi)部類,雙重檢驗(yàn)鎖以及枚舉實(shí)現(xiàn)方式,并主要關(guān)心加載時(shí)機(jī)以及線程安全。 前言 文章介紹了單例模式五種實(shí)現(xiàn)的方式,分別是懶漢,餓漢,靜態(tài)內(nèi)部類,雙重檢驗(yàn)鎖以及枚舉實(shí)現(xiàn)方式,并主要關(guān)心加載時(shí)機(jī)以及線程安全。首先,通俗點(diǎn)講,餓漢就是這個(gè)類還沒(méi)被使用到的時(shí)候,實(shí)例已經(jīng)創(chuàng)建好了;而懶漢是使用到的時(shí)候才創(chuàng)建對(duì)應(yīng)的實(shí)例。線程安全方面主要考慮實(shí)...
閱讀 2644·2021-09-02 15:40
閱讀 1625·2019-08-30 15:54
閱讀 1137·2019-08-30 12:48
閱讀 3466·2019-08-29 17:23
閱讀 1101·2019-08-28 18:04
閱讀 3716·2019-08-26 13:54
閱讀 656·2019-08-26 11:40
閱讀 2469·2019-08-26 10:15