我想了解java中的内部锁。我有一个程序,在这里我启动了2个线程,它们将在同一个对象上循环并调用同步的方法。我期望这两个线程并行执行,但看起来像是按顺序执行。java:为什么两个线程并行执行
如果我在环路中引入睡眠然后它们以随机顺序执行[如我预期]
public class Synchronized {
private int valueM;
public Synchronized(int value) {
valueM = value;
}
synchronized
public void one() throws InterruptedException
{
System.out.println("Object[" + valueM + "] executing one");
Thread.sleep(100); //For case 2: comment it out
System.out.println("Object[" + valueM + "] completed one");
}
synchronized
public void two() throws InterruptedException
{
System.out.println("Object[" + valueM + "] executing two");
Thread.sleep(100); //For case 2: comment it out
System.out.println("Object[" + valueM + "] completed two");
}
}
测试代码:
@org.junit.jupiter.api.Test
void test_sync() throws InterruptedException
{
Synchronized obj = new Synchronized(1);
Runnable task_one = new Runnable() {
public void run() {
for (int i=0 ; i<10; i++)
{
try {
obj.one();
//Thread.sleep(100); //For case 2: uncomment it out
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Runnable task_two = new Runnable() {
public void run() {
for (int i=0 ; i<10; i++)
{
try {
obj.two();
//Thread.sleep(100); //For case 2: uncomment it out
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
Thread t1 = new Thread(task_one);
Thread t2 = new Thread(task_two);
t1.start();
t2.start();
t1.join();
t2.join();
}
输出:
Case 1: output:
Object[1] executing one
Object[1] completed one
...10times
Object[1] executing two
Object[1] completed two
...10times
Case 2: output: random order
Object[1] executing one
Object[1] completed one
Object[1] executing two
Object[1] completed two
...
UPDATE : 原来的问题是固定的..看起来它是随机的,即使在情况1也,但我看到它当我加载更多的迭代(30K)..
因此,在没有睡眠的for循环中线程切换发生得少得多? Java-JVM试图让for循环将其作为“种类”原子(尽可能不完全但尽可能?)来执行,这是否有点特殊?
如果让环形变大,该怎么办?例如30k或更多的迭代? –
@MargaretBloom我怀疑是这样,用1000试过,让我用30K做 –
@SamDaniel我复制你的代码并按原样运行它:它不是为了顺序。它显示了9次1次,10次2次,1次1.我认为,如果没有睡眠,方法非常快,以至于run()调用之间的时间足够第一个线程完成,或者至少在第二个工作开始之前完成大部分工作。 –