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

eag*_*arn 6 java multithreading synchronization thread-synchronization

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


  • 如果一个thread电话SharedResource.staticMethod,将收购lockclass.意思了instanceSharedResource,说X,将不得不等待,直到它得到lock到exectute x.staticMethod.

  • synchronizationthis一个block,获取用于代码或整个该节的锁定object.即可以在另一个thread调用相同method的相同object; 但执行不属于的代码的其余部分synchronization block

  • 如果以上观点属实,那么a dummy objectto lockon不会提供任何额外的好处.正确?

  • 所以有不同的层次synchronziations.Class等级,Object等级和method等级block level.那么这意味着locks这些个人水平应该存在吗?如果我获得了一个锁定Object,另一个Thread无法调用任何methodssame 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 {

}
Run Code Online (Sandbox Code Playgroud)

我已经阅读过这些帖子,但如果我清楚地理解这些帖子,我就不是肯定的.

Java同步方法锁定对象或方法?,java monitor是否包含实例变量?

Hol*_*ger 4

class SharedResource {\n  public synchronized static void staticMethod(){\n    System.out.println("static Method is called");\n    y++; \n  }\n  public synchronized void incrementX(){\n     System.out.println("instance method; incrementX");\n     x++;\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

做同样的事情

\n\n
class SharedResource {\n  public static void staticMethod(){\n    synchronized(SharedResource.class) {\n      System.out.println("static Method is called");\n      y++;\n    }\n  }\n  public void incrementX(){\n    synchronized(this) {\n      System.out.println("instance method; incrementX");\n      x++;\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n