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