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作爲鎖的時候,如果值相同則,那麼線程持有相同的鎖。這樣就造成了另外一個線程不能執行