关于synchronization
in的使用,我需要澄清multi-threaded environment
。我在Class
下面有一个小例子。但实际上我很难对以下内容的工作方式进行测试;我想要测试用例的原因是为了了解如何synchronization
处理这些不同的场景
如果一个thread
电话SharedResource.staticMethod
,将收购lock
的class.
意思了instance
的SharedResource
,说X,将不得不等待,直到它得到lock
到exectute x.staticMethod
。
威尔synchronization
的this
一个block
,获取用于代码或整个该节的锁定object
。即另一个人可以在相同的地方thread
打电话; 但执行不属于该部分的其余代码method
object
synchronization block
如果上述观点是真实的,有dummy object
来lock
上不提供任何额外的好处。正确?
因此存在不同级别的synchronziations
。Class
级别,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 {
}
我已经阅读了这些帖子,但是如果我理解清楚的话,我不是很肯定。
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] 删除。
我来说两句