在Java中使用不同的对象进行同步/锁定。

9 浏览
0 Comments

在Java中使用不同的对象进行同步/锁定。

我有两个不同的对象,但它们是相等的(obj1 != obj2,但obj1.equlas(obj2))。\n我如何像一个对象那样使用同步/锁定这些对象?\n例如:\n

...
synchronized(obj) {
        doSomething(obj);
}
...

\n如果equals()方法中的一个对象同时正在执行某个操作,我希望在这种情况下对其进行锁定。

0
0 Comments

使用不同的对象进行Java中的同步/锁定可能是出于以下原因,可以使用包装器方法来解决:

在上述代码中,通过比较两个对象的equals()方法,决定使用哪个对象进行同步。如果两个对象相等,则返回this,即返回正在调用的对象;如果两个对象不相等,则返回o1。

在测试中,创建了两个Integer对象o1和o2,并打印了它们的比较结果。然后创建了SyncOnEquals对象sync,并创建了两个线程t1和t2。在t1中,使用sync.getSync(o1, o2)来获取同步对象,并在同步块中执行一些操作。在t2中,使用sync.getSync(o2, o1)来获取同步对象,并在同步块中执行一些操作。最后,等待2秒钟。

输出结果显示,t1线程首先开始执行,并且打印了一些信息。然后,t2线程开始执行,并且也打印了一些信息。最后,两个线程都完成了执行。

通过使用不同的对象进行同步,可以避免线程之间的竞争条件,从而提高程序的性能和可靠性。

希望这对你有所帮助!请不要忘记标记实际起作用的答案。

0
0 Comments

使用不同的对象进行同步/锁定在Java中的原因是因为无法使用一个synchronized (object)同时对两个对象进行同步。解决方法有两种:一种是使用嵌套的synchronized块,但如果在另一个线程中颠倒了顺序,可能会导致死锁;另一种解决方法是将obj声明为静态变量,并使用它进行同步。尽管obj和obj2是具有相同意义的对象,但变量的引用指向不同的对象。

0