成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

初學(xué)Java多線(xiàn)程:使用Synchronized塊同步變量

開(kāi)發(fā) 后端
本文是Java多線(xiàn)程初學(xué)教程中的最后一部分,講解如何使用Synchronized塊同步變量。我們可以通過(guò)synchronized塊來(lái)同步特定的靜態(tài)或非靜態(tài)方法。

我們可以通過(guò)synchronized塊來(lái)同步特定的靜態(tài)或非靜態(tài)方法。要想實(shí)現(xiàn)這種需求必須為這些特性的方法定義一個(gè)類(lèi)變量,然后將這些方法的代碼用synchronized塊括起來(lái),并將這個(gè)類(lèi)變量作為參數(shù)傳入synchronized塊。下面的代碼演示了如何同步特定的類(lèi)方法:

  1. package mythread;  
  2.  
  3. public class SyncThread extends Thread  
  4. {  
  5.     private static String sync = "";  
  6.     private String methodType = "";  
  7.  
  8.     private static void method(String s)  
  9.     {  
  10.         synchronized (sync)  
  11.         {  
  12.             sync = s;  
  13.             System.out.println(s);  
  14.             while (true);  
  15.         }  
  16.     }  
  17.     public void method1()  
  18.     {  
  19.         method("method1");  
  20.     }  
  21.     public static void staticMethod1()  
  22.     {  
  23.         method("staticMethod1");  
  24.     }  
  25.     public void run()  
  26.     {  
  27.         if (methodType.equals("static"))  
  28.             staticMethod1();  
  29.         else if (methodType.equals("nonstatic"))  
  30.             method1();  
  31.     }  
  32.     public SyncThread(String methodType)  
  33.     {  
  34.         this.methodType = methodType;  
  35.     }  
  36.     public static void main(String[] args) throws Exception  
  37.     {  
  38.         SyncThread sample1 = new SyncThread("nonstatic");  
  39.         SyncThread sample2 = new SyncThread("static");  
  40.         sample1.start();  
  41.         sample2.start();  
  42.     }  

運(yùn)行結(jié)果如下:

method1
staticMethod1

看到上面的運(yùn)行結(jié)果很多讀者可能感到驚奇。在上面的代碼中method1和staticMethod1方法使用了靜態(tài)字符串變量sync進(jìn)行同步。這兩個(gè)方法只能有一個(gè)同時(shí)執(zhí)行,而這兩個(gè)方法都會(huì)執(zhí)行014行的無(wú)限循環(huán)語(yǔ)句。因此,輸出結(jié)果只能是method1和staticMethod1其中之一。但這個(gè)程序?qū)⑦@兩個(gè)字符串都輸出了。

出現(xiàn)這種結(jié)果的愿意很簡(jiǎn)單,我們看一下012行就知道了。原來(lái)在這一行將sync的值改變了。在這里要說(shuō)一下Java中的String類(lèi)型。String類(lèi)型和Java中其他的復(fù)雜類(lèi)型不同。在使用String型變量時(shí),只要給這個(gè)變量賦一次值,Java就會(huì)創(chuàng)建個(gè)新的String類(lèi)型的實(shí)例。如下面的代碼所示:

  1. String s = "hello";  
  2. System.out.println(s.hashCode());  
  3. s = "world";  
  4. System.out.println(s.hashCode());   

在上面的代碼中。***個(gè)s和再次賦值后的s的hashCode的值是不一樣的。由于創(chuàng)建String類(lèi)的實(shí)例并不需要使用new,因此,在同步String類(lèi)型的變量時(shí)要注意不要給這個(gè)變量賦值,否則會(huì)使變量無(wú)法同步。

由于在013行已經(jīng)為sync創(chuàng)建了一個(gè)新的實(shí)例,假設(shè)method1先執(zhí)行,當(dāng)method1方法執(zhí)行了013行的代碼后,sync的值就已經(jīng)不是最初那個(gè)值了,而method1方法鎖定的仍然是sync變量最初的那個(gè)值。而在這時(shí),staticMethod1正好執(zhí)行到synchronized(sync),在staticMethod1方法中要鎖定的這個(gè)sync和method1方法鎖定的sync已經(jīng)不是一個(gè)了,因此,這兩個(gè)方法的同步性已經(jīng)被破壞了。

解決以上問(wèn)題的方法當(dāng)然是將013行去掉。在本例中加上這行,只是為了說(shuō)明使用類(lèi)變量來(lái)同步方法時(shí)如果在synchronized塊中將同步變量的值改變,就會(huì)破壞方法之間的同步。為了徹底避免這種情況發(fā)生,在定義同步變量時(shí)可以使用final關(guān)鍵字。如將上面的程序中的005行可改成如下形式:

  1. private final static String sync = "";  

使用final關(guān)鍵字后,sync只能在定義時(shí)為其賦值,并且以后不能再修改。如果在程序的其他地方給sync賦了值,程序就無(wú)法編譯通過(guò)。在Eclipse等開(kāi)發(fā)工具中,會(huì)直接在錯(cuò)誤的地方給出提示。

我們可以從兩個(gè)角度來(lái)理解synchronized塊。如果從類(lèi)方法的角度來(lái)理解,可以通過(guò)類(lèi)變量來(lái)同步相應(yīng)的方法。如果從類(lèi)變量的角度來(lái)理解,可以使用synchronized塊來(lái)保證某個(gè)類(lèi)變量同時(shí)只能被一個(gè)方法訪(fǎng)問(wèn)。不管從哪個(gè)角度來(lái)理解,它們的實(shí)質(zhì)都是一樣的,就是利用類(lèi)變量來(lái)獲得同步鎖,通過(guò)同步鎖的互斥性來(lái)實(shí)現(xiàn)同步。

注意:在使用synchronized塊時(shí)應(yīng)注意,synchronized塊只能使用對(duì)象作為它的參數(shù)。如果是簡(jiǎn)單類(lèi)型的變量(如int、char、boolean等),不能使用synchronized來(lái)同步。

【編輯推薦】

  1. 初學(xué)Java多線(xiàn)程:使用Synchronized塊同步方法
  2. 初學(xué)Java多線(xiàn)程:使用Synchronized關(guān)鍵字同步類(lèi)方法
  3. 初學(xué)Java多線(xiàn)程:從線(xiàn)程返回?cái)?shù)據(jù)的兩種方法
  4. 初學(xué)Java多線(xiàn)程:向線(xiàn)程傳遞數(shù)據(jù)的三種方法
  5. 初學(xué)Java多線(xiàn)程:慎重使用volatile關(guān)鍵字
責(zé)任編輯:yangsai 來(lái)源: 真的有外星人嗎
相關(guān)推薦

2009-06-29 18:32:52

Java多線(xiàn)程Synchronize

2009-06-29 18:26:11

Java多線(xiàn)程Synchronize同步類(lèi)

2011-04-14 13:27:53

Synchronize多線(xiàn)程

2009-06-29 18:00:05

Java多線(xiàn)程Runnable接口創(chuàng)建線(xiàn)程

2009-06-29 17:49:47

Java多線(xiàn)程

2009-06-29 18:08:51

Java多線(xiàn)程join方法

2009-06-29 18:14:23

Java多線(xiàn)程volatile關(guān)鍵字

2024-07-05 08:32:36

2009-06-29 17:54:10

Java多線(xiàn)程Thread類(lèi)創(chuàng)建線(xiàn)程

2009-06-29 18:03:15

Java多線(xiàn)程線(xiàn)程的生命周期

2017-05-27 20:59:30

Java多線(xiàn)程synchronize

2010-01-21 11:27:30

linux多線(xiàn)程機(jī)制線(xiàn)程同步

2010-03-15 19:37:00

Java多線(xiàn)程同步

2009-11-13 15:46:25

Java多線(xiàn)程

2015-07-22 09:39:38

IOS多線(xiàn)程同步

2015-07-22 09:51:51

iOS開(kāi)發(fā)線(xiàn)程

2024-11-27 15:58:49

2009-09-22 17:21:24

線(xiàn)程局部變量

2011-06-22 13:47:16

Java多線(xiàn)程

2011-06-22 13:57:54

Java多線(xiàn)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 99久久久无码国产精品 | 国产精品99久久久久久动医院 | 天天插天天舔 | 日韩中文电影 | 久久久久一区 | 91精品国产色综合久久 | 国产精品中文字幕在线 | 国产精品黄视频 | 国产成人精品综合 | 污视频免费在线观看 | 日韩av看片 | 日韩视频专区 | 欧美三级电影在线播放 | 91精品在线播放 | 超碰欧美| 黄色一级片视频 | 国产日韩免费观看 | 欧美一级欧美一级在线播放 | 国产成人精品一区二 | 日本三级日产三级国产三级 | 精品一区二区三区免费毛片 | 日日av| 欧美日韩精品中文字幕 | 完全免费在线视频 | 成人一区在线观看 | 国产一区二区免费在线 | 久久久.com| 黄色一级大片在线免费看产 | 日韩aⅴ片 | 午夜精品导航 | 日韩成人免费视频 | 久久亚洲欧美日韩精品专区 | 亚洲精久 | 精品1区 | 四虎影音 | 国产在线中文字幕 | 亚洲成人在线免费 | 亚洲一区中文字幕在线观看 | 亚洲视频在线看 | 日本三级黄视频 | 日本久久精品视频 |