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++;
}
}
}