class ZiggyTest{
public static void main(String[] args){
RunnableThread rt = new RunnableThread();
Thread t1 = new Thread(rt);
Thread t2 = new Thread(rt);
Thread t3 = new Thread(rt);
t1.start();
t2.start();
t3.setPriority(10);
t3.start();
try{
t3.join();
t2.join();
t1.join();
System.out.println("Joined");
}catch(InterruptedException e){System.out.println(e);}
Thread t4 = new Thread(new RunnableThread());
Thread t5 = new Thread(new RunnableThread());
Thread t6 = new Thread(new RunnableThread());
t4.start();
t5.start();
t6.start();
}
}上面的测试产生以下输出
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-2
Thread-2
Thread-2
Thread-2
Thread-2
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Joined
Thread-3
Thread-3
Thread-4
Thread-4
Thread-3
Thread-4
Thread-5
Thread-4
Thread-3
Thread-4
Thread-5
Thread-3
Thread-5
Thread-5
Thread-5我不明白为什么最后三个线程不像前三个线程那样使用String对象作为共享锁。即使最后三个线程使用不同的“RunnableThread”实例,它们是否应该同步,因为在字符串常量池中只有一个“str”副本?
谢谢
编辑
哦..。我忘了包括RunnableThread。
class RunnableThread implements Runnable{
String str = "HELLO";
public void run(){
runMe();
}
public synchronized void runMe(){
for (int a : new int[]{1,2,3,4,5}){
System.out.println(Thread.currentThread().getName());
}
}
}发布于 2012-01-01 01:29:11
您的线程不会在任何String对象上同步,更不用说同一个对象了,所以我不确定这个想法从何而来。由于下面这一行中的synchronized关键字,它们在RunnableThread对象本身上同步:
public synchronized void runMe(){对最后三个线程使用单独的RunnableThread对象意味着它们独立运行。
现在,如果您真的希望锁定全局String对象,则该方法将如下所示
public void runMe(){
synchronized (str) {
for (int a : new int[]{1,2,3,4,5}){
System.out.println(Thread.currentThread().getName());
}
}
}这将是一个好主意,使str final。
https://stackoverflow.com/questions/8689470
复制相似问题