这个跟线程安全没关系。this指当前调用对象。 比如 Test test = new Test(); Test test2 = new Test();Test类有个method方法,里面用到了this, 当你写成 test.method();时,这个this就是test, 当你写成 test2.method();时,这个this就是test2.synchronized(this) 就是对当前调用对象同步, 用test去调用就是同步test,用test2调用就是同步test2 如果写成synchronized(test2) 不管用谁调用,都同步test2.
this 就是指的是当前调用对象
public class User { private int id; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId(int id) { synchronized(this){ this.id = id; } } } 这段代码,是不是就是在给这个字段赋值的时候,给id这个字段加锁呀,其他读的操作必须等待setId()之后再运行啊
比如
Test test = new Test();
Test test2 = new Test();Test类有个method方法,里面用到了this,
当你写成 test.method();时,这个this就是test,
当你写成 test2.method();时,这个this就是test2.synchronized(this) 就是对当前调用对象同步, 用test去调用就是同步test,用test2调用就是同步test2
如果写成synchronized(test2) 不管用谁调用,都同步test2.
private int id; /**
* @return the id
*/
public int getId() {
return id;
} /**
* @param id the id to set
*/
public void setId(int id) {
synchronized(this){
this.id = id;
}
}
}
这段代码,是不是就是在给这个字段赋值的时候,给id这个字段加锁呀,其他读的操作必须等待setId()之后再运行啊
其他读取操作如果不是synchronized的话,不会等待
user.setId(1);那么在user.getId();的时候是不是就要等待啊 ?谢谢各位!!
没事,慢慢来,JDK 中涉及线程和线程、并发的 API 很复杂的,在国内估计也没多少人精通!
引用 2 楼 soli11722984 的回复:
自己用自己作为锁对象
如果getId方法不是synchronized,就不会等待,因为不是synchronized就不会请求锁
比如一个方法中第一行代码就是sychronized(this)的话。那么你可以理解成,无论多少个对象要调用这个方法,都必须等待。这里的等待可以理解成排队。
比如一个方法是用于遍历输出不同集合的值。如果这个公共遍历方法使用了sychronized(this),假如多个集合同时需要遍历,那也需要排队,按照顺序一个一个处理。
这样就不会出现数据混乱。。
可以看看Vector的源码,Vector被称为线程安全,他基本上所有方法都是使用sychronized来保证“线程安装”的。