1. 程式人生 > >String物件常量池特性對synchronized物件的影響

String物件常量池特性對synchronized物件的影響

一 .什麼是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() throws
Exception { 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");

 結果為:,現在即時兩個執行緒叫錯列印。

三.執行緒死鎖的原因

造成執行緒死鎖的本質原因就是:雙方互相持有對方的鎖,互相等待對方釋放鎖那麼一定會造成死鎖。