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

想要学习

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


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

  • 威尔synchronizationthis一个block,获取用于代码或整个该节的锁定object即另一个人可以在相同的地方thread打电话; 但执行不属于该部分的其余代码methodobjectsynchronization block

  • 如果上述观点是真实的,有dummy objectlock上不提供任何额外的好处。正确?

  • 因此存在不同级别的synchronziationsClass级别,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同步方法锁定对象还是方法?java监视器是否包含实例变量?

霍尔格
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实例方法不会相互阻塞。但是“方法级别”和“块级别”之间没有区别;重要的是选择哪个对象进行同步。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中方法与侦听器之间的同步执行

来自分类Dev

任何类的实例作为Java中方法的输入

来自分类Dev

Java中方法的原型

来自分类Dev

Java在类中同步方法

来自分类Dev

Java中方法特定的常量

来自分类Dev

访问超类中方法的变量

来自分类Dev

如何获取类中方法的名称

来自分类Dev

使用clang获取类中方法的列表

来自分类Dev

访问超类中方法的变量

来自分类Dev

类中方法的 EXC_BAD_ACCESS

来自分类Dev

类对象上的同步

来自分类Dev

Java语言规范:“注释的类”作为注释类型中方法的返回类型

来自分类Dev

无法访问Java中另一个类中方法的返回实例

来自分类Dev

Java中的同步(对象和静态方法)

来自分类Dev

Java中对象的非同步方法?

来自分类Dev

Java同步方法未锁定对象

来自分类Dev

传递给Java中方法的对象可在原始副本上使用

来自分类Dev

计算Java文件中方法的数量

来自分类Dev

如何找到Java中方法调用的行号

来自分类Dev

java中方法声明中的异常

来自分类Dev

通过同步方法访问的私有类参数是否被视为“同步对象”?

来自分类Dev

在Java中同步对象

来自分类Dev

跨对象的Java同步

来自分类Dev

跨对象的Java同步

来自分类Dev

Java中的对象同步

来自分类Dev

TypeScript:继承类中方法的自引用返回类型

来自分类Dev

R参考类和多个文件中方法的顺序

来自分类Dev

模板类中方法的完全专业化

来自分类Dev

类中方法声明的顺序对编译器重要吗?