摘要:靜態(tài)方法的鎖對(duì)象是本類的屬性賣票案例出現(xiàn)了線程安全問(wèn)題賣出了不存在的票和重復(fù)的票解決線程安全問(wèn)題的二種方案使用同步方法使用步驟把訪問(wèn)了共享數(shù)據(jù)的代碼抽取出來(lái)放到一個(gè)方法中在方法上添加修飾符格式定義方法的格式修飾符返回值類型方法名參數(shù)列表可能
靜態(tài)方法的鎖對(duì)象是本類的class屬性
package com.itheima.demo08.Synchronized;
/*
賣票案例出現(xiàn)了線程安全問(wèn)題 賣出了不存在的票和重復(fù)的票 解決線程安全問(wèn)題的二種方案:使用同步方法 使用步驟: 1.把訪問(wèn)了共享數(shù)據(jù)的代碼抽取出來(lái),放到一個(gè)方法中 2.在方法上添加synchronized修飾符 格式:定義方法的格式 修飾符 synchronized 返回值類型 方法名(參數(shù)列表){ 可能會(huì)出現(xiàn)線程安全問(wèn)題的代碼(訪問(wèn)了共享數(shù)據(jù)的代碼) }
*/
public class RunnableImpl implements Runnable{
//定義一個(gè)多個(gè)線程共享的票源 private static int ticket = 100; //設(shè)置線程任務(wù):賣票 @Override public void run() { System.out.println("this:"+this);//this:com.itheima.demo08.Synchronized.RunnableImpl@58ceff1 //使用死循環(huán),讓賣票操作重復(fù)執(zhí)行 while(true){ payTicketStatic(); } } /* 靜態(tài)的同步方法 鎖對(duì)象是誰(shuí)? 不能是this this是創(chuàng)建對(duì)象之后產(chǎn)生的,靜態(tài)方法優(yōu)先于對(duì)象 靜態(tài)方法的鎖對(duì)象是本類的class屬性-->class文件對(duì)象(反射) */ public static /*synchronized*/ void payTicketStatic(){ synchronized (RunnableImpl.class){ //先判斷票是否存在 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--; } } } /* 定義一個(gè)同步方法 同步方法也會(huì)把方法內(nèi)部的代碼鎖住 只讓一個(gè)線程執(zhí)行 同步方法的鎖對(duì)象是誰(shuí)? 就是實(shí)現(xiàn)類對(duì)象 new RunnableImpl() 也是就是this */ public /*synchronized*/ void payTicket(){ synchronized (this){ //先判斷票是否存在 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.demo08.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(); System.out.println("run:"+run);//run:com.itheima.demo08.Synchronized.RunnableImpl@58ceff1 //創(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://hztianpu.com/yun/75600.html
摘要:同步塊用來(lái)避免競(jìng)爭(zhēng)。實(shí)際需要那種同步塊視具體情況而定。在非同步的方法中的同步塊的例子如下所示示例使用同步塊構(gòu)造器來(lái)標(biāo)記一塊代碼是同步的。在同步構(gòu)造器中用括號(hào)括起來(lái)的對(duì)象叫做監(jiān)視器對(duì)象。他們的構(gòu)造器引用同一個(gè)實(shí)例。 Java 同步塊(synchronized block)用來(lái)標(biāo)記方法或者代碼塊是同步的。Java同步塊用來(lái)避免競(jìng)爭(zhēng)。本文介紹以下內(nèi)容: Java同步關(guān)鍵字(synchro...
摘要:線程同步方法是通過(guò)鎖來(lái)實(shí)現(xiàn),每個(gè)對(duì)象都有切僅有一個(gè)鎖,這個(gè)鎖與一個(gè)特定的對(duì)象關(guān)聯(lián),線程一旦獲取了對(duì)象鎖,其他訪問(wèn)該對(duì)象的線程就無(wú)法再訪問(wèn)該對(duì)象的其他非同步方法對(duì)于靜態(tài)同步方法,鎖是針對(duì)這個(gè)類的,鎖對(duì)象是該類的對(duì)象。 對(duì)實(shí)現(xiàn)了Runnable或者Callable接口類,可以通過(guò)多線程執(zhí)行同一實(shí)例的run或call方法,那么對(duì)于同一實(shí)例中的局部變量(非方法變量)就會(huì)有多個(gè)線程進(jìn)行更改或讀取...
摘要:的關(guān)鍵字中的塊使用關(guān)鍵字進(jìn)行標(biāo)記。由于每個(gè)類只有一個(gè)類對(duì)象存在于中,因此全局同時(shí)只有一個(gè)線程能夠進(jìn)入到同一個(gè)類的靜態(tài)同步方法中。同步代碼塊使這種期望成為可能。注意同步代碼塊如何在括號(hào)中接受一個(gè)對(duì)象。相同的實(shí)例被傳入兩個(gè)不同的線程實(shí)例中。 Java的synchronized塊標(biāo)記一個(gè)方法或一個(gè)代碼塊為同步的。synchronized塊能用于防止出現(xiàn)競(jìng)態(tài)條件。 Java的synchroni...
摘要:基本使用同步代碼塊同步代碼塊延時(shí)秒,方便后面測(cè)試作用代碼塊時(shí),方法中的,是指調(diào)用該方法的對(duì)象。那么這個(gè)時(shí)候使用關(guān)鍵字就需要注意了推薦使用同步代碼塊,同步的代碼塊中傳入外部定義的一個(gè)變量。 簡(jiǎn)述 計(jì)算機(jī)單線程在執(zhí)行任務(wù)時(shí),是嚴(yán)格按照程序的代碼邏輯,按照順序執(zhí)行的。因此單位時(shí)間內(nèi)能執(zhí)行的任務(wù)數(shù)量有限。為了能在相同的時(shí)間內(nèi)能執(zhí)行更多的任務(wù),就必須采用多線程的方式來(lái)執(zhí)行(注意:多線程模式無(wú)法減...
摘要:關(guān)鍵字總結(jié)有個(gè)關(guān)鍵字,它們是接下來(lái)對(duì)其中常用的幾個(gè)關(guān)鍵字進(jìn)行概括。而通過(guò)關(guān)鍵字,并不能解決非原子操作的線程安全性。為了在一個(gè)特定對(duì)象的一個(gè)域上關(guān)閉,可以在這個(gè)域前加上關(guān)鍵字。是語(yǔ)言的關(guān)鍵字,用來(lái)表示一個(gè)域不是該對(duì)象串行化的一部分。 java 關(guān)鍵字總結(jié) Java有50個(gè)關(guān)鍵字,它們是: abstract do implements private ...
摘要:八種基本數(shù)據(jù)類型數(shù)組定義數(shù)組元素類型數(shù)組名元素類型元素個(gè)數(shù)和數(shù)組長(zhǎng)度元素類型數(shù)組名元素類型元素元素元素元素內(nèi)存的劃分寄存器本地方法區(qū)方法區(qū)棧內(nèi)存存儲(chǔ)局部變量變量所屬作用域一旦結(jié)束變量自動(dòng)釋放方法進(jìn)棧局部變量屬于方法所以方法要先進(jìn)棧堆內(nèi)存存儲(chǔ) 八種基本數(shù)據(jù)類型 byte short int long boolean char float double JAVA數(shù)組 定義數(shù)組 元...
閱讀 741·2021-09-22 10:02
閱讀 6733·2021-09-03 10:49
閱讀 640·2021-09-02 09:47
閱讀 2261·2019-08-30 15:53
閱讀 2999·2019-08-30 15:44
閱讀 1017·2019-08-30 13:20
閱讀 1939·2019-08-29 16:32
閱讀 959·2019-08-29 12:46