Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中方法、对象和类的同步_Java_Multithreading_Synchronization_Thread Synchronization - Fatal编程技术网

Java中方法、对象和类的同步

Java中方法、对象和类的同步,java,multithreading,synchronization,thread-synchronization,Java,Multithreading,Synchronization,Thread Synchronization,关于在多线程环境中使用同步,我需要一些说明。下面我有一个小例子Class。但实际上我发现很难做一个测试用例来说明下面的工作原理;我想要测试用例的原因是为了理解同步如何处理这些不同的场景 如果线程调用SharedResource.staticMethod,它将获取类的锁。是否意味着SharedResource的实例,比如x,必须等到它获得锁才能执行x.staticMethod 将同步此在块中的获取该部分代码或整个对象的锁。i、 e另一个线程可以在同一对象上调用相同的方法;但执行不属于同步块的剩

关于在
多线程环境中使用
同步
,我需要一些说明。下面我有一个小例子
Class
。但实际上我发现很难做一个测试用例来说明下面的工作原理;我想要测试用例的原因是为了理解
同步
如何处理这些不同的场景


  • 如果
    线程
    调用
    SharedResource.staticMethod
    ,它将获取
    类的
    是否意味着
    SharedResource
    实例
    ,比如x,必须等到它获得
    才能执行
    x.staticMethod

  • 同步
    块中的
    获取该部分代码或整个
    对象的锁。i、 e另一个
    线程
    可以在同一
    对象
    上调用相同的
    方法
    ;但执行不属于
    同步块的剩余代码

  • 如果上述情况属实,启用
    虚拟对象
    锁定
    不会带来任何额外好处。对吗

  • 所以有不同层次的同步<代码>类
级别、
对象
级别、
方法
级别和
块级别
。这意味着这些单独级别的锁应该存在? 如果我在
对象
上获得了锁,另一个
线程
无法在
相同对象
上调用任何
方法
,但是如果我在
方法
上获得了锁,另一个
线程
可以在不同的
方法
上获得锁。这是正确的吗

关于如何创建作用于同一对象和同一方法的两个线程的一些技巧将非常有用(我知道我需要扩展
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 {

}
我读过这些帖子,但如果我理解得很清楚,我并不乐观

,

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
代码块。由于
实例和该类的特定实例是不同的对象,
同步静态
方法和
同步
实例方法不会相互阻塞。但“方法级”和“块级”没有区别;重要的一点是选择哪个对象进行同步。

还有一篇关于java同步的好文章,其中只有一种类型的同步,那就是对象上的同步。使用synchronized的位置和方式决定了它是哪个对象。Java以监视器的方式运行。因此,当同步对象objectA和objectB时,会获得不同的锁。@SotiriosDelimanolis:提到“当线程调用同步方法时,它会自动获取该方法对象的内部锁,并在该方法返回时释放它。”这是否意味着存在方法的锁?@ackertolearn它说
该方法的对象
。在对象上调用实例方法。线程将获取该对象的监视器。没有方法锁这样的东西。谢谢你的解释。我想测试其中的一些,如何创建两个线程,它们作用于相同的对象并调用相同的方法?问题的最后一点请参见“定义和启动线程”或“SimpleThreads示例”部分
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++;
    }
  }
}