gpt4 book ai didi

java - Java中方法、对象、类的同步

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:29 26 4
gpt4 key购买 nike

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


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

  • block 中的this同步,获取该部分代码或整个的锁对象。即另一个 thread 可以在同一个 object 上调用同一个 method 吗?但执行不属于同步块(synchronized block)

  • 的其余代码
  • 如果上述观点属实,则将虚拟对象 锁定 不会提供任何额外的好处。正确吗?

  • 所以有不同级别的同步级别,对象级别,方法级别和 block 级别。那么这是否意味着这些单独级别的应该存在?如果我在 Object 上获得了锁,另一个 Thread 就不能在 same object 上调用任何 methods,但是如果我在 method 上获得了锁,另一个 thread 可以在不同的 method 上获得锁。这是正确的吗?

关于如何创建作用于同一个对象和同一个方法的两个线程的一些技巧会有所帮助(我知道我需要扩展 Thread 类或实现 Runnable 接口(interface)).但不确定如何让两个线程在同一个对象上调用同一个方法。

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?

最佳答案

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

关于java - Java中方法、对象、类的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22051438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com