关于在synchronization
中使用multi-threaded environment
,我需要做一些澄清。我在下面有一个小例子Class
。但我实际上发现很难做出以下内容如何工作的测试用例;我想要测试用例的原因是要了解synchronization
如何处理这些不同的场景
如果thread
拨打SharedResource.staticMethod
,它将获得lock
的{{1}}是否意味着class.
instance
,比如x,必须等到SharedResource
exectute lock
。
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 {
}
我已阅读过这些帖子,但如果我清楚地理解这些帖子,我就不会感到满意。
Java synchronized method lock on object, or method?,Does java monitor include instance variables?
答案 0 :(得分:4)
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
实例方法不会相互阻塞。但“方法级别”和“块级别”之间没有区别;重要的一点是选择哪个对象进行同步。