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"); 复制代码 结果为:,现在即时两个线程叫错打印。 三.线程死锁的原因 造成线程死锁的本质原因就是:双方互相持有对方的锁,互相等待对方释放锁那么一定会造成死锁。https://www.cnblogs.com/SAM-CJM/p/9826251.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信