摘要:實(shí)現(xiàn)賣(mài)票案例定義一個(gè)多個(gè)線程共享的票源設(shè)置線程任務(wù)賣(mài)票使用死循環(huán)讓賣(mài)票操作重復(fù)執(zhí)行先判斷票是否存在提高安全問(wèn)題出現(xiàn)的概率讓程序睡眠票存在賣(mài)票正在賣(mài)第張票模擬賣(mài)票案例創(chuàng)建個(gè)線程同時(shí)開(kāi)啟對(duì)共享的票進(jìn)行出售創(chuàng)建接口的實(shí)現(xiàn)類對(duì)象創(chuàng)建類對(duì)
package com.itheima.demo06.ThreadSafe;
/*
實(shí)現(xiàn)賣(mài)票案例
*/
public class RunnableImpl implements Runnable{
//定義一個(gè)多個(gè)線程共享的票源 private int ticket = 100; //設(shè)置線程任務(wù):賣(mài)票 @Override public void run() { //使用死循環(huán),讓賣(mài)票操作重復(fù)執(zhí)行 while(true){ //先判斷票是否存在 if(ticket>0){ //提高安全問(wèn)題出現(xiàn)的概率,讓程序睡眠 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,賣(mài)票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在賣(mài)第"+ticket+"張票"); ticket--; } } }
}
package com.itheima.demo06.ThreadSafe;
/*
模擬賣(mài)票案例 創(chuàng)建3個(gè)線程,同時(shí)開(kāi)啟,對(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方法開(kāi)啟多線程 t0.start(); t1.start(); t2.start(); }
}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/75608.html
摘要:不可變?cè)谥校豢勺兊膶?duì)象一定是線程安全的。在里標(biāo)注自己是線程安全的類,大多都不是絕對(duì)線程安全,比如某些情況下類在調(diào)用端也需要額外的同步措施。無(wú)同步方案要保證線程安全,不一定就得需要數(shù)據(jù)的同步,兩者沒(méi)有因果關(guān)系。 在之前學(xué)習(xí)編程的時(shí)候,有一個(gè)概念根深蒂固,即程序=算法+數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)代表問(wèn)題空間中的客體,代碼就用來(lái)處理這些數(shù)據(jù),這種思維是站在計(jì)算機(jī)的角度去抽象問(wèn)題和解決問(wèn)題,稱之為面向過(guò)...
摘要:此時(shí),就出現(xiàn)了線程不安全問(wèn)題了。因?yàn)榈某跏贾禃?huì)是因此,重排序是有可能導(dǎo)致線程安全問(wèn)題的。真的能完全保證一個(gè)變量的線程安全嗎我們通過(guò)上面的講解,發(fā)現(xiàn)關(guān)鍵字還是挺有用的,不但能夠保證變量的可見(jiàn)性,還能保證代碼的有序性。 對(duì)于volatile這個(gè)關(guān)鍵字,相信很多朋友都聽(tīng)說(shuō)過(guò),甚至使用過(guò),這個(gè)關(guān)鍵字雖然字面上理解起來(lái)比較簡(jiǎn)單,但是要用好起來(lái)卻不是一件容易的事。 這篇文章將從多個(gè)方面來(lái)講解vol...
摘要:前言本文是一篇簡(jiǎn)短的雜糅本文源自于作者最近的一個(gè)疑問(wèn)為什么在舊版的中偏向鎖的移除一定要在全局安全點(diǎn)進(jìn)行同時(shí)在上個(gè)星期作者參與的一個(gè)項(xiàng)目發(fā)生了一件怪事一個(gè)服務(wù)莫名其妙地不接受任何請(qǐng)求了一切請(qǐng)求都是而查看日志發(fā)現(xiàn)出故障的服務(wù)本身去請(qǐng)求另一個(gè)服務(wù) 前言 本文是一篇簡(jiǎn)短的雜糅. 本文源自于作者最近的一個(gè)疑問(wèn):為什么在舊版的jdk中偏向鎖的移除一定要在全局安全點(diǎn)進(jìn)行?同時(shí)在上個(gè)星期,作者參與的一...
摘要:線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的。常量始終是線程安全的,因?yàn)橹淮嬖谧x操作。局部變量是線程安全的。有狀態(tài)對(duì)象,就是有實(shí)例變量的對(duì)象,可以保存數(shù)據(jù),是非線程安全的。 前言 有多少人在使用Spring框架時(shí),很多時(shí)候不知道或者忽視了多線程的問(wèn)題? ??因?yàn)閷?xiě)程序時(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)閷?xiě)程序時(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...
閱讀 821·2023-04-26 00:37
閱讀 706·2021-11-24 09:39
閱讀 2132·2021-11-23 09:51
閱讀 3769·2021-11-22 15:24
閱讀 735·2021-10-19 11:46
閱讀 1868·2019-08-30 13:53
閱讀 2410·2019-08-29 17:28
閱讀 1314·2019-08-29 14:11