package com.freeflying.thread.sync;
/**
* 使用String类型作为锁
* @ClassName: ConstantPoolString
* @Description:
* @author freeflying
* @date 2018年7月5日
*/
public class ConstantPoolString {
public static void main(String[] args) {
ConstantPoolStringEx constantPoolStringEx=new ConstantPoolStringEx();
ConstantPoolStringA constantPoolStringA=new ConstantPoolStringA(constantPoolStringEx);
constantPoolStringA.setName("A");
constantPoolStringA.start();
ConstantPoolStringB constantPoolStringB=new ConstantPoolStringB(constantPoolStringEx);
constantPoolStringB.setName("B");
constantPoolStringB.start();
}
}
class ConstantPoolStringEx{
public static void print(String string) {
try {
synchronized (string) {
while (true) {
System.out.println(Thread.currentThread().getName());
Thread.sleep(1000);
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
class ConstantPoolStringA extends Thread{
private ConstantPoolStringEx constantPoolStringEx;
public ConstantPoolStringA(ConstantPoolStringEx constantPoolStringEx) {
this.constantPoolStringEx=constantPoolStringEx;
}
@Override
public void run() {
constantPoolStringEx.print("AA");
}
}
class ConstantPoolStringB extends Thread{
private ConstantPoolStringEx constantPoolStringEx;
public ConstantPoolStringB(ConstantPoolStringEx constantPoolStringEx) {
this.constantPoolStringEx=constantPoolStringEx;
}
@Override
public void run() {
constantPoolStringEx.print("AA");
}
}
结果
A
A
A
A
A
A
A
A
A
A
A
A
结论:
因为在JVM中具有String常量池(如果两个String具有相同的值,那么他们的地址是相同的,都保存在这个常量池中)。当以String作为锁的时候,如果值相同则,那么线程持有相同的锁。这样就造成了另外一个线程不能执行