我最近开始学习java中的多线程。我尝试了同步的各种场景。这是我的代码
package main_classes;
public class Synchronized_test implements Runnable {
public Object lock2=new Object();
private static int shared_var;
public Synchronized_test()
{
shared_var=0;
}
int getsharedvarvalue()
{
return shared_var;
}
void setsharedvarvalue(int i)
{
shared_var=i;
}
public void run()
{
synchronized(lock2)
{
System.out.println("Child Thread: Waiting");
for(int i=0;i<5;i++)
{
//this.setsharedvarvalue(i);
System.out.println("Child Thread: Shared Variable = " + shared_var);
}
}
}
//@SuppressWarnings("unused")
public static void main(String args[]) throws InterruptedException
{
Synchronized_test st=new Synchronized_test();
Thread t=new Thread(new Synchronized_test());
t.start();
synchronized(st.lock2)
{
for(int i=0;i<5;i++)
{
st.setsharedvarvalue(i);
System.out.println("Main Thread: Shared Variable = " +st.getsharedvarvalue());
}
}
}
}这是输出
Child Thread: Waiting
Main Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Main Thread: Shared Variable = 1
Child Thread: Shared Variable = 1
Main Thread: Shared Variable = 2
Child Thread: Shared Variable = 2
Main Thread: Shared Variable = 3
Child Thread: Shared Variable = 3
Main Thread: Shared Variable = 4
Child Thread: Shared Variable = 4根据我从在线阅读中了解到的,如果锁被其他线程获取,则线程必须等待。因此,根据代码,无论哪个线程先获得lock,都将打印出所有值,然后第二个线程执行。但从输出中可以看出,两个线程似乎都在它们的同步块中,并且同时运行。请解释一下这种行为。
PS:这个输出并不是我得到的唯一输出。有时,我得到的输出与上面提到的理论一致。就像这个
Child Thread: Waiting
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Child Thread: Shared Variable = 0
Main Thread: Shared Variable = 0
Main Thread: Shared Variable = 1
Main Thread: Shared Variable = 2
Main Thread: Shared Variable = 3
Main Thread: Shared Variable = 4发布于 2014-03-23 21:33:25
你只运行了一个线程对象,不是吗?
Synchronized_test st=new Synchronized_test();
Thread t=new Thread(new Synchronized_test());
t.start();只启动线程t,而根本不运行st。
https://stackoverflow.com/questions/22591489
复制相似问题