我们都知道Java中String 常量池的功能,先看下面的代码:
public class Test184 {
static String a = "a";
static String b = "a";
public static void main(String[] args) {
System.out.println(a==b);
}
}
由上面可知:虽然两个变量,都是指向同一个字符串地址。
下面我们来看,synchronized(String)同步代码块与String联合使用带来的问题。
public class Test183Service {
public static void show(String content) {
synchronized (content) {
while(true) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
MyTaskThread mtt = new MyTaskThread();
Thread t = new Thread(mtt);
Thread t1 = new Thread(mtt);
t.start();
t1.start();
}
}
class MyTaskThread implements Runnable{
Test183Service ts = new Test183Service();
@Override
public void run() {
// TODO Auto-generated method stub
ts.show("aa");
}
}
运行的结果:一个线程运行之后,另外一个线程就不会获取线程执行机会。原因就是String常量池带来的问题,两个字符实则是一个对象,show方法锁持有的是相同的锁,因此在大多数情况下,同步synchronized代码块都不使用String作为锁对象,而改用其他,比如实例一个Object对象。