摘要:靜態方法的鎖對象是本類的屬性賣票案例出現了線程安全問題賣出了不存在的票和重復的票解決線程安全問題的二種方案使用同步方法使用步驟把訪問了共享數據的代碼抽取出來放到一個方法中在方法上添加修飾符格式定義方法的格式修飾符返回值類型方法名參數列表可能
靜態方法的鎖對象是本類的class屬性
package com.itheima.demo08.Synchronized;
/*
賣票案例出現了線程安全問題 賣出了不存在的票和重復的票 解決線程安全問題的二種方案:使用同步方法 使用步驟: 1.把訪問了共享數據的代碼抽取出來,放到一個方法中 2.在方法上添加synchronized修飾符 格式:定義方法的格式 修飾符 synchronized 返回值類型 方法名(參數列表){ 可能會出現線程安全問題的代碼(訪問了共享數據的代碼) }
*/
public class RunnableImpl implements Runnable{
//定義一個多個線程共享的票源 private static int ticket = 100; //設置線程任務:賣票 @Override public void run() { System.out.println("this:"+this);//this:com.itheima.demo08.Synchronized.RunnableImpl@58ceff1 //使用死循環,讓賣票操作重復執行 while(true){ payTicketStatic(); } } /* 靜態的同步方法 鎖對象是誰? 不能是this this是創建對象之后產生的,靜態方法優先于對象 靜態方法的鎖對象是本類的class屬性-->class文件對象(反射) */ public static /*synchronized*/ void payTicketStatic(){ synchronized (RunnableImpl.class){ //先判斷票是否存在 if(ticket>0){ //提高安全問題出現的概率,讓程序睡眠 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,賣票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在賣第"+ticket+"張票"); ticket--; } } } /* 定義一個同步方法 同步方法也會把方法內部的代碼鎖住 只讓一個線程執行 同步方法的鎖對象是誰? 就是實現類對象 new RunnableImpl() 也是就是this */ public /*synchronized*/ void payTicket(){ synchronized (this){ //先判斷票是否存在 if(ticket>0){ //提高安全問題出現的概率,讓程序睡眠 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } //票存在,賣票 ticket-- System.out.println(Thread.currentThread().getName()+"-->正在賣第"+ticket+"張票"); ticket--; } } }
}
package com.itheima.demo08.Synchronized;
/*
模擬賣票案例 創建3個線程,同時開啟,對共享的票進行出售
*/
public class Demo01Ticket {
public static void main(String[] args) { //創建Runnable接口的實現類對象 RunnableImpl run = new RunnableImpl(); System.out.println("run:"+run);//run:com.itheima.demo08.Synchronized.RunnableImpl@58ceff1 //創建Thread類對象,構造方法中傳遞Runnable接口的實現類對象 Thread t0 = new Thread(run); Thread t1 = new Thread(run); Thread t2 = new Thread(run); //調用start方法開啟多線程 t0.start(); t1.start(); t2.start(); }
}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75600.html
摘要:線程同步方法是通過鎖來實現,每個對象都有切僅有一個鎖,這個鎖與一個特定的對象關聯,線程一旦獲取了對象鎖,其他訪問該對象的線程就無法再訪問該對象的其他非同步方法對于靜態同步方法,鎖是針對這個類的,鎖對象是該類的對象。 對實現了Runnable或者Callable接口類,可以通過多線程執行同一實例的run或call方法,那么對于同一實例中的局部變量(非方法變量)就會有多個線程進行更改或讀取...
摘要:的關鍵字中的塊使用關鍵字進行標記。由于每個類只有一個類對象存在于中,因此全局同時只有一個線程能夠進入到同一個類的靜態同步方法中。同步代碼塊使這種期望成為可能。注意同步代碼塊如何在括號中接受一個對象。相同的實例被傳入兩個不同的線程實例中。 Java的synchronized塊標記一個方法或一個代碼塊為同步的。synchronized塊能用于防止出現競態條件。 Java的synchroni...
摘要:基本使用同步代碼塊同步代碼塊延時秒,方便后面測試作用代碼塊時,方法中的,是指調用該方法的對象。那么這個時候使用關鍵字就需要注意了推薦使用同步代碼塊,同步的代碼塊中傳入外部定義的一個變量。 簡述 計算機單線程在執行任務時,是嚴格按照程序的代碼邏輯,按照順序執行的。因此單位時間內能執行的任務數量有限。為了能在相同的時間內能執行更多的任務,就必須采用多線程的方式來執行(注意:多線程模式無法減...
摘要:關鍵字總結有個關鍵字,它們是接下來對其中常用的幾個關鍵字進行概括。而通過關鍵字,并不能解決非原子操作的線程安全性。為了在一個特定對象的一個域上關閉,可以在這個域前加上關鍵字。是語言的關鍵字,用來表示一個域不是該對象串行化的一部分。 java 關鍵字總結 Java有50個關鍵字,它們是: abstract do implements private ...
閱讀 634·2021-09-22 10:02
閱讀 6326·2021-09-03 10:49
閱讀 565·2021-09-02 09:47
閱讀 2151·2019-08-30 15:53
閱讀 2929·2019-08-30 15:44
閱讀 900·2019-08-30 13:20
閱讀 1812·2019-08-29 16:32
閱讀 889·2019-08-29 12:46