我想知道如果在同一个对象上同步两次,在Java中是否会出现任何奇怪的行为?
场景如下
pulbic class SillyClassName {
object moo;
...
public void method1(){
synchronized(moo)
{
....
method2();
....
}
}
public void method2(){
synchronized(moo)
{
doStuff();
}
}
}
两种方法都使用该对象并对其进行同步。当第一个方法调用第二个方法时,它会被锁定而停止吗?
我不这么认为,因为它是同一个线程,但是我不确定是否可能会出现其他任何奇怪的结果。
同步块使用 可重入 锁,这意味着如果线程已经持有该锁,则它可以重新获取它而不会出现问题。因此,您的代码将按预期工作。
请参阅Java教程页面的底部“
固有锁定和同步”。
要引用截至2015年1月的价格…
重入同步
回想一下,一个线程无法获取另一个线程拥有的锁。但是线程可以获取它已经拥有的锁。允许线程多次获取相同的锁将启用 可重入同步
。这描述了一种情况,其中同步代码直接或间接调用也包含同步代码的方法,并且两组代码使用相同的锁。如果没有可重入同步,则同步代码将不得不采取许多其他预防措施,以避免线程自身阻塞。
我只在一个字符串对象上找到了同步的答案,而不是两个。 这不是一项真正的任务,而是一项任务。我有一个图书馆可以把钱从一个账户转到另一个账户。我无法访问帐户对象以锁定它。我只能用图书馆里的东西。传输(字符串从、字符串到),这不是线程安全的。我有一个帐户ID为字符串的方法。我需要在没有死锁的情况下锁定这两个字符串。 到目前为止,我所做的是: > 使用创建了新字符串。intern方法(字符串fr=from
假设我们有两个类A、B和各自类的同步方法methodA、methodB。如果我们从synchronizedmethodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍对ObjectA保持锁定?
如果我没有错的话,Thread-1和thread-3正在进入synchronized方法,因为它有两个不同的目标对象。但是为什么线程2进入同步块呢? 请帮助我理解这一点。提前谢了。
我试图理解java中同步块的概念。根据我读过的文档,我明白如果我们获取一个锁(使用实例变量的同步块),那么我们就不能在该类中的同一对象上获取同步锁。但是当我尝试实际使用以下片段时,我发现我的理解出了问题。 即我能够同时以两种不同的方法获取锁(同一实例变量上的同步块)。当线程启动时,它将转到run方法并无限期地等待,并且不会从同步块中出来。同时,如果我使用相同的线程调用stop方法,它会进入同步块并
我需要在账户之间实现一些基本的资金转移逻辑。为了保持转账的一致性,我利用了同步锁。 这是帐户对象: 这是在transfer worker类中: 我的问题是,如果source Account没有足够的资金,我计划等待该线程,直到它从其他运营中获得资金。对于这个,我一直在等待源帐户。但它以死锁告终,因为目标帐户锁仍在我的帐户上。我怎样才能做到这一点?你能告诉我解决这个问题的正确方法吗? 这就是我试图推
问题内容: 代码段-1 代码段-2 我在第一个代码段中遇到了竞争。我知道这是因为我正在获得对不可变对象(类型为Integer)的锁定。 我已经写了第二个代码片段,这再次使“布尔”不变。但这有效(输出运行中不显示竞争条件)。如果我正确理解了上一个问题的解决方案,则以下是出现问题的一种可能方法 线程1锁定由指向的对象(例如A) 线程2现在试图获取由指向的对象的锁,并进入A的等待队列。 线程1进入同步块