String物件常量池特性對synchronized物件的影響
阿新 • • 發佈:2018-10-31
一 .什麼是String的常量池特性
對於字串物件有兩種建立方法,如下:
直接賦值法:
String str1="直接賦值建立字串";
建立物件法:
String str2=new String("建立物件來建立字串");
第一種方法是直接建立在常量池中的,下面可以看到區別:
/** * @ClassName String_Synchronized * @Author 真正的小明被佔用了 * @Date 2018/10/21/021 14:54 * @Version 1.0 */ public class String_Synchronized {public static void main(String[] args) { String str1="A"; String str2="A"; System.out.println(str1==str2);// true 比較兩個變數的地址值,輸出為TRUE證明兩個物件為同一個物件 String str3=new String("B"); String str4=new String("B"); System.out.println(str3==str4);//false } }
也就是說明在常量池中建立的物件是同一個物件,而使用new關鍵字建立的變數是重新分配記憶體的,是兩個不同的物件。
二.在多執行緒中出現的問題
程式碼如下:
將一個類的String物件同步化
/** * @ClassName String_Synchronized * @Author 真正的小明被佔用了 * @Date 2018/10/21/021 14:54 * @Version 1.0 */ public class String_Synchronized { private String str; public String_Synchronized(String str){ this.str=str; } public void fan() throwsException { synchronized (str){//同步化String對像 //假如這個方法需要大量的時間去執行多執行緒可以提高效率.....我們使用死迴圈來代替 while(true){ Thread.sleep(1000); System.out.println("當前的執行緒為"+Thread.currentThread().getName()); } } } }
執行緒類:
public class Str_Thread extends Thread{ private String_Synchronized string_synchronized; public Str_Thread(String_Synchronized string_synchronized){ this.string_synchronized=string_synchronized; } @Override public void run(){ try { string_synchronized.fan(); } catch (Exception e) { e.printStackTrace(); } } }
測試類:
public class Text { public static void main(String[] args) { String str1 ="A"; String str2 ="A"; String_Synchronized string_synchronized1 =new String_Synchronized(str1); String_Synchronized string_synchronized2 =new String_Synchronized(str2); Str_Thread str_thread1 =new Str_Thread(string_synchronized1); Str_Thread str_thread2 =new Str_Thread(string_synchronized2); str_thread1.start(); str_thread2.start(); } }
結果就是:說明str_thread1執行緒沒有沒打斷,出現死鎖現象。
我們修改一下程式碼:
String str1 =new String ("A"); String str2 =new String ("A");
結果為:,現在即時兩個執行緒叫錯列印。
三.執行緒死鎖的原因
造成執行緒死鎖的本質原因就是:雙方互相持有對方的鎖,互相等待對方釋放鎖那麼一定會造成死鎖。