java - 对象同步,java

标签 java multithreading

我正在阅读有关 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/

相关文章:

java - 数据库的自动更新会在错误的一侧创建单向连接

java - 来自 ByteArrayInputStream 的 Camel 路由

java - 为什么单线程进程在多个处理器/内核上执行?

java - 允许哪些线程调用 SwingWorker#publish?

cocoa - NSNotification 和多线程

java - 形成 Mockito "grammars"

java - 解析带小数点的整数

java - AtomicInteger 的映射

Java - 如何同步 1 个列表上的 2 个线程?

java - 编写 Java Server 以并发(同时)处理多个客户端