关键字 synchronized 的作用(个人理解):
多个线程访问同一个类或对象实例时,可以使用 synchronized 关键字锁定该类或对象实例,当某个线程执行到锁定该类或对象实例的代码块时,其他线程将不可以再访问该类或对象实例,直到执行完该代码块,其他线程才可以访问。
有类MyObj ,实例对象 myObj = new MyObj(),多个线程都引用 myObj;
class MyObj {
public int i = 0;
public static int j = 0;
public int add() {
return i = i + 1;
}
public synchronized int add2() {
return i = i + 1;
}
public static int add3() {
return j = j + 1;
}
public synchronized static int add4() {
return j = j + 1;
}
}
- 在子线程里的run(),使用 synchronized 锁定 myObj
synchronized(myObj){
//执行到这里,其他线程将无法访问myObj,直到执行完改代码块
//myObj.i = myObj.i+1;
//myObj.add(); //跟上面处理达到一样正确的处理效果
}
达到跟上面一样正确的处理效果,还可以直接 调用myObj.add2();因为改方法已经使用了synchronized修饰
- 在子线程里的run(),使用 synchronized 锁定 MyObj.class
synchronized(MyObj.class ){
//执行到这里,其他线程将无法访问 MyObj.class ,直到执行完改代码块
//MyObj.j = MyObj.j+1;
//MyObj.add3(); //跟上面处理达到一样正确的处理效果
}
达到跟上面一样正确的处理效果,还可以直接 调用MyObj.add4();因为改方法已经使用了synchronized修饰
网友评论