gpt4 book ai didi

java - 对象同步,java

转载 作者:行者123 更新时间:2023-12-01 10:30:55 27 4
gpt4 key购买 nike

我正在阅读有关 Java 多线程编程的 Oracle 教程。我不明白为什么要创建一个新对象来同步代码的某些部分?创建新的虚拟对象的目的是什么?

我确实明白,创建这两个对象将阻止编译器重新排序由构造 synchronized(lock1){}

保护的代码段

但是,我想知道我可以在构造syncronized(lock1){}中使用任何其他对象(除了MsLunch)吗?

引入这样的构造syncronized(lock1){}背后的动机是什么?

这是我关心的代码片段:

public class MsLunch {
private long c1 = 0;
private long c2 = 0;
// what is the purpose of these two objects? how do they serve as locks?
private Object lock1 = new Object();
private Object lock2 = new Object();

public void inc1() {
synchronized(lock1) {
c1++;
}
}

public void inc2() {
synchronized(lock2) {
c2++;
}
}
}

最佳答案

首先一些基础知识:

同步对象被用作打开限制区域(同步块(synchronized block))的门的 key 。

只要线程进入该限制区域,它就会持有监视器(锁),以便其他线程无法进入。当一个线程退出限制区域时,它会释放监视器,另一个线程可以占用它。

这意味着使用相同同步对象的每个同步块(synchronized block)将阻止其他线程进入,直到监视器可用(解锁)为止。

For what reason does the creation of new dummy object serve?

原因是您应该使用其他对象无法访问的对象,而不是使用它们的对象。这就是同步对象是私有(private)的原因。如果其他人可以访问它们,其他人可能会在应用程序中某处的同步块(synchronized block)中使用它们。如果同步对象是例如public 那么其他所有对象都可以使用它。这可能会导致意外使用并可能导致死锁。

因此,您应该确保谁将获得同步对象的引用。

关于java - 对象同步,java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35101492/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com