多線程 synchronized

java
public class SynchronizedDome {
public static void main(String[] args) {
Map ticketMap = new HashMap<String, Boolean>();//票池:<票編號,是否已出售>
for(int i = 1; i <= 100; i++){//生成100張火車票到票池
ticketMap.put("T" + i, false);
}

//生成4名售票員
TicketSaler s1 = new TicketSaler(ticketMap, "S1");
TicketSaler s2 = new TicketSaler(ticketMap, "S2");
TicketSaler s3 = new TicketSaler(ticketMap, "S3");
TicketSaler s4 = new TicketSaler(ticketMap, "S4");

    Thread t1 =new Thread(s1);
    Thread t2 =new Thread(s2);
    Thread t3 =new Thread(s3);
    Thread t4 =new Thread(s4);

    t1.setName("T1");
    t2.setName("T2");
    t3.setName("T3");
    t4.setName("T4");

    ExecutorService service = Executors.newCachedThreadPool();

    service.execute(t1);
    service.execute(t2);
    service.execute(t3);
    service.execute(t4);

    service.shutdown();//執(zhí)行完線程池中的線程后盡快退出

}

}
class TicketSaler implements Runnable {
private Map<String, Boolean> ticketMap;//票池
private String salerName;//售票員姓名

public TicketSaler(Map<String, Boolean> ticketMap, String salerName){
    this.ticketMap = ticketMap;
    this.salerName = salerName;
}


//售票
private void saleTicket(){
    int rigter = 100;
    for(Iterator<String> it = ticketMap.keySet().iterator(); ;){
        synchronized (ticketMap)
        {
            if(it.hasNext()){
                String ticketNo = it.next();
                if(!ticketMap.get(ticketNo)){
                    System.out.println(rigter--);
                    System.out.println(salerName +":" + ticketNo + "已被售出。");
                    ticketMap.put(ticketNo, true);
                }
            }else{
                System.out.println("沒票了9刖ā!!!");
                break;
            }
        }
    }
}
@Override
public void run() {
    saleTicket();
}

}

因為[Java](http://lib.csdn.net/base/javase)或者C#中的線程同步與多線程的概念,只是在單個對象下 這一范圍內的械拍,也就是說:單個對象下的 多線程同步 或者 死鎖。如果有下面的需求:
1装盯,該類只允許在同一時刻實例化(new)一次坷虑;----考慮單例模式.
2,或者只允許在同一時刻僅可存活一個對于[數(shù)據(jù)庫](http://lib.csdn.net/base/mysql)的修改 或 刪除操作埂奈;--考慮單例模式 或者 數(shù)據(jù)庫內的事務鎖概念迄损。

下面我們著重介紹java中的 Sychronized的用法,具體為:同步方法 與 同步塊
synchronized 關鍵字挥转,它包括兩種用法:synchronized 方法和 synchronized 塊海蔽。
  1. synchronized 方法:通過在方法聲明中加入 synchronized關鍵字來聲明 synchronized 方法。如:
  public synchronized void accessVal(int newVal);
  synchronized 方法控制對類成員變量的訪問:每個類實例對應一把鎖绑谣,每個 synchronized 方法都必須獲得調用該方法的類實例的鎖方能執(zhí)行党窜,否則所屬線程阻塞,方法一旦執(zhí)行借宵,就獨占該鎖幌衣,直到從該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖壤玫,重新進入可執(zhí)行狀態(tài)豁护。這種機制確保了同一時刻對于每一個類實例,其所有聲明為 synchronized 的成員函數(shù)中至多只有一個處于可執(zhí)行狀態(tài)(因為至多只有一個能夠獲得該類實例對應的鎖)欲间,從而有效避免了類成員變量的訪問沖突(只要所有可能訪問類成員變量的方法均被聲明為 synchronized)楚里。
  在 Java 中,不光是類實例猎贴,每一個類也對應一把鎖班缎,這樣我們也可將類的靜態(tài)成員函數(shù)聲明為 synchronized 蝴光,以控制其對類的靜態(tài)成員變量的訪問。
  synchronized 方法的缺陷:若將一個大的方法聲明為synchronized 將會大大影響效率达址,典型地蔑祟,若將線程類的方法 run() 聲明為 synchronized ,由于在線程的整個生命期內它一直在運行沉唠,因此將導致它對本類任何 synchronized 方法的調用都永遠不會成功疆虚。當然我們可以通過將訪問類成員變量的代碼放到專門的方法中,將其聲明為 synchronized 满葛,并在主方法中調用來解決這一問題径簿,但是 Java 為我們提供了更好的解決辦法,那就是 synchronized 塊纱扭。
  2. synchronized 塊:通過 synchronized關鍵字來聲明synchronized 塊牍帚。語法如下:
  synchronized(syncObject) {
  //允許訪問控制的代碼
  }
   synchronized 塊是這樣一個代碼塊,其中的代碼必須獲得對象 syncObject (如前所述乳蛾,可以是類實例或類)的鎖方能執(zhí)行暗赶,具體機制同前所述。由于可以針對任意代碼塊肃叶,且可任意指定上鎖的對象蹂随,故靈活性較高。
  對synchronized(this)的一些理解
  一因惭、當兩個并發(fā)線程訪問同一個對象object中的這個synchronized(this)同步代碼塊時岳锁,一個時間內只能有一個線程得到執(zhí)行。另一個線程必須等待當前線程執(zhí)行完這個代碼塊以后才能執(zhí)行該代碼塊蹦魔。
  二激率、然而,當一個線程訪問object的一個synchronized(this)同步代碼塊時勿决,另一個線程仍然可以訪問該object中的非synchronized(this)同步代碼塊乒躺。
  三、尤其關鍵的是低缩,當一個線程訪問object的一個synchronized(this)同步代碼塊時嘉冒,其他線程對object中所有其它synchronized(this)同步代碼塊的訪問將被阻塞。
  四咆繁、第三個例子同樣適用其它同步代碼塊讳推。也就是說,當一個線程訪問object的一個synchronized(this)同步代碼塊時玩般,它就獲得了這個object的對象鎖银觅。結果,其它線程對該object對象所有同步代碼部分的訪問都被暫時阻塞坏为。
  五究驴、以上規(guī)則對其它對象鎖同樣適用
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末慨仿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纳胧,更是在濱河造成了極大的恐慌,老刑警劉巖帘撰,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跑慕,死亡現(xiàn)場離奇詭異,居然都是意外死亡摧找,警方通過查閱死者的電腦和手機核行,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹬耘,“玉大人芝雪,你說我怎么就攤上這事∽厶Γ” “怎么了惩系?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長如筛。 經常有香客問我堡牡,道長,這世上最難降的妖魔是什么杨刨? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任晤柄,我火速辦了婚禮,結果婚禮上妖胀,老公的妹妹穿的比我還像新娘芥颈。我一直安慰自己,他們只是感情好赚抡,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布爬坑。 她就那樣靜靜地躺著,像睡著了一般怕品。 火紅的嫁衣襯著肌膚如雪妇垢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天肉康,我揣著相機與錄音闯估,去河邊找鬼。 笑死吼和,一個胖子當著我的面吹牛涨薪,可吹牛的內容都是我干的。 我是一名探鬼主播炫乓,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼刚夺,長吁一口氣:“原來是場噩夢啊……” “哼献丑!你這毒婦竟也來了?” 一聲冷哼從身側響起侠姑,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤创橄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莽红,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妥畏,經...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年安吁,在試婚紗的時候發(fā)現(xiàn)自己被綠了醉蚁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡鬼店,死狀恐怖网棍,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情妇智,我是刑警寧澤滥玷,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站俘陷,受9級特大地震影響罗捎,放射性物質發(fā)生泄漏。R本人自食惡果不足惜拉盾,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一桨菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捉偏,春花似錦倒得、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讹躯,卻和暖如春菩彬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潮梯。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工骗灶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秉馏。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓耙旦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萝究。 傳聞我的和親對象是個殘疾皇子免都,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內容

  • 一锉罐、概念 房子相當于進程Process,本身無法做什么绕娘。里面住了很多人脓规,就相當于線程Thread,共享這個房子的資...
    合肥黑閱讀 1,369評論 0 6
  • Java8張圖 11险领、字符串不變性 12抖拦、equals()方法、hashCode()方法的區(qū)別 13舷暮、...
    Miley_MOJIE閱讀 3,710評論 0 11
  • 前言:雖然自己平時都在用多線程,也能完成基本的工作需求噩茄,但總覺得下面,還是對線程沒有一個系統(tǒng)的概念,所以绩聘,查閱了一些資...
    justCode_閱讀 713評論 0 9
  • 一:java概述:1沥割,JDK:Java Development Kit,java的開發(fā)和運行環(huán)境凿菩,java的開發(fā)工...
    ZaneInTheSun閱讀 2,662評論 0 11
  • 今天發(fā)生了一件事讓我心里久久無法平靜衅谷,事情是這樣的:我大學學的會計專業(yè)椒拗,現(xiàn)在工作也是財務相關,但現(xiàn)在的工作還沒有讓...
    我是一小白白閱讀 459評論 1 1