Java中方法,对象,类的同步

时间:2014-02-26 19:34:35

标签: java multithreading synchronization thread-synchronization

关于在synchronization中使用multi-threaded environment,我需要做一些澄清。我在下面有一个小例子Class。但我实际上发现很难做出以下内容如何工作的测试用例;我想要测试用例的原因是要了解synchronization如何处理这些不同的场景


  • 如果thread拨打SharedResource.staticMethod,它将获得lock的{​​{1}}是否意味着class. instance ,比如x,必须等到SharedResource exectute lock

  • x.staticMethod中的synchronization this会获取该代码部分或整个block的锁定。即另一个object可以在同一个thread上拨打同一个method;但执行不属于object

  • 的其余代码
  • 如果上述观点属实,则synchronization blockdummy object开启不会带来任何额外好处。正确的吗?

  • 因此lock有不同级别。 synchronziations级别,Class级别,Object级别和method。那么这意味着block level这些个别水平应该存在吗? 如果我在locks上获得了锁定,则另一个Object无法呼叫Thread上的任何methods,但如果我获得same object上的锁定,则另一个method thread可以锁定其他method。这是对的吗?

关于如何创建两个作用于同一对象和相同方法的线程的一些提示将有所帮助(我理解我需要扩展Thread类或实现Runnable接口)。但不确定如何让两个线程在同一个对象上调用相同的方法。

class SharedResource {
     public Integer x =0;
     public static Integer y=0;
     Object dummy = new Object();
     public Integer z=0;

     public synchronized static void staticMethod(){
         System.out.println("static Method is called");
         y++; 
     }

     public synchronized void incrementX(){
         System.out.println("instance method; incrementX");
         x++;
     }

     public void incrementXBlock(){
         synchronized(this){
             x++;
         }
         System.out.println("instance method; incrementXBlock");
     }

     public void incrementZ(){
         synchronized (dummy) {
             z++;
         } 
         System.out.println("synchronized on dummy; incrementZ method ");
     }
}

public class ThreadSynchronization extends Thread {

}

我已阅读过这些帖子,但如果我清楚地理解这些帖子,我就不会感到满意。

Java synchronized method lock on object, or method?Does java monitor include instance variables?

1 个答案:

答案 0 :(得分:4)

class SharedResource {
  public synchronized static void staticMethod(){
    System.out.println("static Method is called");
    y++; 
  }
  public synchronized void incrementX(){
     System.out.println("instance method; incrementX");
     x++;
  }
}

相同
class SharedResource {
  public static void staticMethod(){
    synchronized(SharedResource.class) {
      System.out.println("static Method is called");
      y++;
    }
  }
  public void incrementX(){
    synchronized(this) {
      System.out.println("instance method; incrementX");
      x++;
    }
  }
}

简单地说,进入同步块的线程将在块的持续时间内获取指定对象的锁定。这意味着至多一个线程可以为特定的锁对象执行synchronized代码块。由于Class实例和该类的特定实例是不同的对象,因此synchronized static方法和synchronized实例方法不会相互阻塞。但“方法级别”和“块级别”之间没有区别;重要的一点是选择哪个对象进行同步。