同步对象,java

这个问题在这里已经有了答案:

  • 避免在Java中同步(this)? 18个答案

  • 首先是一些基础知识:

    同步对象用作打开限制区域的门(同步块)的键。

    只要一个线程进入这个限制区域,它就拥有监视器(锁定),以便其他线程不能进入。 当一个线程退出受限区域时,它释放监视器,另一个线程可以接受它。

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

    创建新的虚拟对象的原因是什么?

    原因是你应该使用别人对象无法访问的对象,而不是那些使用它们的对象。 这就是为什么同步对象是private 。 如果他们可以被其他人访问,其他人可能会在应用程序中某处的同步块中使用它们。 如果同步对象是例如public那么每个其他对象都可以使用它。 这可能会导致意外的使用并可能导致死锁。

    所以你应该确定谁将获得对同步对象的引用。


    锁由线程访问,以检查代码当前是“正在使用”还是可以在锁定对象本身后执行。 你可能会认为它可能是自动的,但它有一个使用编译器无法推断的用法:你可以使用同一个锁来同步多个代码块,同时限制对其中任何一个的访问。


    在我看来,虚拟Object只是代表了同步的角度。

    为了同步不同的线程,你必须能够声明同步点和(如果需要)从代码的不同部分访问这一点。 例如:

       private Object lock = new Object();
    
       public void inc1() {
              synchronized(lock) {
                   c1++;
              }
       }
    
       public void inc2() {
              synchronized(lock) {
                   c2++;
              } 
       }
    

    在这个例子中显示了来自不同代码部分的同步点的使用。

    而且由于Java是面向对象的语言,即Java中的语言单位是Object,所以我们完全有这样的构造。

    顺便说一句,您可以使用任何对象作为同步点。 你甚至可以做到这一点:

    public void inc1() {
           synchronized(this) {
                c1++;
           }
    }
    
    链接地址: http://www.djcxy.com/p/76259.html

    上一篇: Synchronization on object, java

    下一篇: java synchronized (this) scope