[英]Simple Thread Synchronization Issue
在下面的代码中,无论是否同步bar
方法,输出都不会有所不同-我在做什么错? 我相信,同步“ bar”将使“ ThreaOne”被打印10次,然后仅开始打印“ ThreadTwo”,但事实并非如此。 我得到的输出如下:
I am Test thread:Thread OneOneOneOne I am Test thread:Thread OneOneOneOne I am Test thread:Thread OneOneOneOne I am Test thread:Thread OneOneOneOne I am in main now I am Test thread:Thread OneOneOneOne I am Test thread:Thread Two I am Test thread:Thread Two I am Test thread:Thread OneOneOneOne I am Test thread:Thread Two I am Test thread:Thread OneOneOneOne I am Test thread:Thread Two I am Test thread:Thread OneOneOneOne I am Test thread:Thread Two I am Test thread:Thread OneOneOneOne I am Test thread:Thread Two I am Test thread:Thread OneOneOneOne I am Test thread:Thread Two I am Test thread:Thread Two I am Test thread:Thread Two I am Test thread:Thread Two I am in main now
等等。 这是我的代码:
package com.rahul;
class ThreadTest implements Runnable{
@Override
public void run() {
bar();
}
public synchronized void bar() {
for(int i=0;i<10;i++){
System.out.println("I am Test thread:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class Test{
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadTest(),"Thread OneOneOneOne");
Thread t2 = new Thread(new ThreadTest(),"Thread Two");
t1.start();
try{
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
while(true){
System.out.println("I am in main now");
try {
t2.join();
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
您有ThreadTest
两个实例 。 他们彼此无关。 您没有调用相同的bar()
如果您改为这样做:
ThreadTest tt = new ThreadTest();
Thread t1 = new Thread(tt,"Thread OneOneOneOne");
Thread t2 = new Thread(tt,"Thread Two");
然后,两个线程共享一个ThreadTest
实例,并且只有一个线程一次可以在单个实例上调用bar()
。
声明要synchronized
的方法不会达到您期望的效果。 每个线程都在其自己的ThreadTest
实例上同步,因此调用不会交互。 您需要在一个共享对象上同步一个线程才能阻止另一个线程。 例如:
class ThreadTest implements Runnable{
private static Object LOCK_OBJECT = new Object();
@Override
public void run() {
bar();
}
public void bar() {
synchronized (LOCK_OBJECT) {
for(int i=0;i<10;i++){
System.out.println("I am Test thread:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
您正在同步的方法仅由一个线程访问,因为它们是实例方法,因此每个线程都在调用它自己的 bar方法。
也许您想将bar方法声明为static
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.