[英]Thread Synchronization related issue
我最近开始学习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
据我从在线阅读中了解到,如果其他线程获得了锁,则线程必须等待。 因此,根据代码,无论哪个线程首先获得锁,都将打印出所有值,然后执行第二个线程。 但是从输出看来,两个线程都在它们的同步块内并且同时运行。 请解释此行为。
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
您只运行一个线程对象,不是吗?
Synchronized_test st=new Synchronized_test();
Thread t=new Thread(new Synchronized_test());
t.start();
只启动线程t
而您根本不运行st
。
您仅运行一个线程“ t”。 请注意,st是已实现Runnable接口的Synchronized_class实例。 您将必须启动一个新线程“ t0”。 尝试以下代码:
Thread t0 = new Thread(new Synchronized_test());
Thread t = new Thread(new Synchronized_test());
t0.start();
t.start();
此外,您的代码尚不清楚,无法理解“同步语句”的概念。 我建议您从链接http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html尝试一个简单的同步语句示例。 它可以清除您的理解并帮助您更好地构建代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.