f********a 发帖数: 165 | 1 import java.util.HashMap;
public class MyClass {
public static HashMap hashMap = new HashMap
Integer>();
private String s = new String();
public void log1(String msg1, String msg2){
synchronized(hashMap){
System.out.println(msg1);
System.out.println(msg2);
}
}
public void log2()
{
hashMap.put(new String("123"), new Integer(1));
}
public static void log3(String msg1, String msg2){
synchronized(new String()){
System.out.println(msg1);
System.out.println(msg2);
}
}
public static void log4(String msg1, String msg2){
synchronized(String.class){
System.out.println(msg1);
System.out.println(msg2);
}
}
public static void log5(String msg1, String msg2){
String s = new String();
}
}
在non-static的method里面,比如log1,我们经常用synchronized(this)或者
synchronize(object),这时候synchronized是apply在this或者object这个instance上
面,如果如题中所示,synchronized(hashMap) hashMap是个static variable,那
synchronized是apply在HashMap的class object上面吧? 那如果两个thread,一个call
log1,同时一个call log2,如果log1先执行,然后log2需要等待log1执行完吧,因为
HashMap的class object被lock住了,hashMap.put是不能被执行的吧。
在static method里面,比如log3,是不能call instance variable s的,但是可以如题
中一样new String(), 但其实如果有多个thread call log3, 互相之间不会有影响吧?
最后如果我们用synchronized(String.class) 是String 的class object被lock住了,
当1个线程call MyClass1.log4, 另一个线程call MyClass1.log5,如果log4执行到
synchronized(String.class),log5到String s = new String();是不能执行的,因为
String 的class object被lock住了,是不是这样?
有点乱,不好意思。 | f********a 发帖数: 165 | | g*****g 发帖数: 34805 | 3 Object.
【在 f********a 的大作中提到】 : import java.util.HashMap; : public class MyClass { : : public static HashMap hashMap = new HashMap: Integer>(); : private String s = new String(); : : public void log1(String msg1, String msg2){ : synchronized(hashMap){ : System.out.println(msg1);
|
|