Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么执行同步方法后线程仍然锁定?_Java_Multithreading - Fatal编程技术网

Java 为什么执行同步方法后线程仍然锁定?

Java 为什么执行同步方法后线程仍然锁定?,java,multithreading,Java,Multithreading,我正在阅读java多线程教程,其中说线程只在完成同步方法之前放弃键,但是当我运行以下代码时(大约20次): 公共类SyncDemo实现可运行{ @凌驾 公开募捐{ 对于(int i=0;i

我正在阅读java多线程教程,其中说线程只在完成同步方法之前放弃键,但是当我运行以下代码时(大约20次):

公共类SyncDemo实现可运行{
@凌驾
公开募捐{
对于(int i=0;i<10;i++){
sync();
}
}
私有同步的void sync(){
System.out.println(Thread.currentThread().getName());
}
公共静态void main(字符串[]args){
SyncDemo s=新的SyncDemo();
螺纹a=新螺纹,“a”);
螺纹b=新螺纹(s,“b”);
a、 start();
b、 start();
}
}

它只打印
a
然后打印
b
,我认为这是一个混合序列,因为每次在循环中执行
sync()
后,当前线程都会解锁?因此,让另一个线程有机会打印它的名称?

在您的程序中,没有任何东西需要特定的执行顺序。因此,运行时将以在当前情况下最有意义的方式安排线程。可能影响顺序的因素是处理器数量、负载情况,

当我运行时,我得到了
a
b
的混合序列。很可能,第一个线程在第二个线程启动之前就已经完成了。好吧,这是一种解脱,尽管我又尝试了20次,但仍然得到了相同的结果。
public class SyncDemo implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            sync();
        }
    }

    private synchronized void sync() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        SyncDemo s = new SyncDemo();
        Thread a = new Thread(s, "a");
        Thread b = new Thread(s, "b");
        a.start();
        b.start();
    }
}