String對象常量池特性對synchronized對象的影響

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

 結果爲:,如今即時兩個線程叫錯打印。

三.線程死鎖的緣由

形成線程死鎖的本質緣由就是:雙方互相持有對方的鎖,互相等待對方釋放鎖那麼必定會形成死鎖。

相關文章
相關標籤/搜索