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");

 结果为:,如今即时两个线程叫错打印。

三.线程死锁的缘由

形成线程死锁的本质缘由就是:双方互相持有对方的锁,互相等待对方释放锁那么必定会形成死锁。

相关文章
相关标签/搜索