一 .什麼是String的常量池特性多線程
對於字符串對象有兩種建立方法,以下:ide
直接賦值法:測試
String str1="直接賦值建立字符串";
建立對象法:this
String str2=new String("建立對象來建立字符串");
第一種方法是直接建立在常量池中的,下面能夠看到區別:spa
/** * @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關鍵字建立的變量是從新分配內存的,是兩個不一樣的對象。線程
二.在多線程中出現的問題3d
代碼以下:code
將一個類的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() throws Exception { synchronized (str){//同步化String對像 //假如這個方法須要大量的時間去執行多線程能夠提升效率.....咱們使用死循環來代替 while(true){ Thread.sleep(1000); System.out.println("當前的線程爲"+Thread.currentThread().getName()); } } } }
線程類:blog
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");
結果爲:,如今即時兩個線程叫錯打印。
三.線程死鎖的緣由
形成線程死鎖的本質緣由就是:雙方互相持有對方的鎖,互相等待對方釋放鎖那麼必定會形成死鎖。