一 .什么是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");
结果为:,现在即时两个线程叫错打印。
三.线程死锁的原因
造成线程死锁的本质原因就是:双方互相持有对方的锁,互相等待对方释放锁那么一定会造成死锁。