1
4
当您声明要同步的方法时,例如:
编译器将其视为您编写的:
记住:同步对象不会阻止其他线程调用该对象上的方法。它只防止另一个线程使用同一个锁对象进入同步块。 顺便说一下,通常最好有一个内部锁对象,而不是声明要同步的方法,例如。
因为我锁定了foo的实例,所以同步的方法(带有它们的隐式“synchronized(this)”)将无法获得锁,并将永远阻塞。最重要的是,你不能阻止这一点,因为我可以在任何我喜欢的对象上同步。很明显,这个例子是极端的,但是如果你对这类事情不小心的话,你可能会得到讨厌的,微妙的死锁错误。 |
2
8
只有关键字为synchronized的方法持有
这
当线程在该方法中运行时。
|
3
3
在这两种情况下,第二个线程都将被授予执行其方法的权限。
因为这两个方法中只有一个包含
在这里我还假设
synchronized (this) { } 如果是这样的话,结果就不一样了。
|
4
2
一个方法是同步的,而另一个不是。因此,无论对象上的锁(在本例中是方法所属的实例)是否已被获取,非同步方法都将不受阻碍地执行(因为它不试图获取或等待锁)。这意味着在这两种情况下,两个线程都将在不等待对方的情况下运行,这可能导致对象的状态不一致。 |
5
0
method1()是同步的,因此称为线程安全方法。当多个线程试图同时访问此方法时,只有实例对象上的锁才能工作。
在这两种情况下,您提到的一个线程将通过调用method1()获得实例的锁,另一个线程将尝试访问method2(),这是不安全的,因此两个线程都将执行。
|
6
0
两个线程都将像不存在锁一样执行。
如果两个线程都执行method1,其中一个线程将阻塞,直到另一个线程退出该方法并释放锁为止。 要确保只有一个线程执行,所有其他线程等待,必须使两个方法同步。 |
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
rhymes · 如何让线程操作相同的java列表 2 年前 |