本部分内容均是来自《Java多线程编程核心技术》感觉以后可能会用到于是在博客上分享一下。
本部分说一下String常量对象对synchronized同步方法产生的可能错误。这部分内容需要你先了解到在JVM中相同的String常量在常量池中只维护一份。 下面的线程同步问题也是由于这个原因导致的,上代码。
package service;
/**
* Created by xiaopguo on 2017/9/23.
*/
public class Service {
public static void print(String stringPara) {
try{
synchronized (stringPara){
while (true){
System.out.println(Thread.currentThread().getName());
Thread.sleep(1000);
}
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
package srevicethread1;
import service.Service;
/**
* Created by xiaopguo on 2017/9/23.
*/
public class ThreadA extends Thread{
private Service service = new Service();
public ThreadA(Service service){
super();
this.service = service;
}
@Override
public void run(){
service.print("AA");
}
}
package srevicethread1;
import service.Service;
/**
* Created by xiaopguo on 2017/9/23.
*/
public class ThreadB extends Thread {
private Service service = new Service();
public ThreadB(Service service){
this.service = service;
}
@Override
public void run(){
service.print("AA");
}
}
程序会难以终止,无法停止原因由于常量“AA”在常量池中仅维护一份,导致两个线程持有相同的锁。