标签:
首先,来看一段代码。
1 public class PersonSet { 2 3 private final Set<Person> mySet = new HashSet<Person>(); 4 5 public synchronized void add(Person p){ 6 mySet.add(p); 7 } 8 9 public synchronized boolean contains(Person p){ 10 return mySet.contains(p); 11 } 12 13 class Person{} 14 }
此段代码出自java并发编程,书上写这段代码是线程安全的。按照我之前的理解,我认为不是线程安全的。
下面展示一下我错误观点的思路:
假如有 Personset personA = new PersonSet(); Thread threadA、threadB 。threadA里面调用 对象personA的contains()方法,threadB调用对象personA的add()方法,这个时候不就是不安全的吗。
--------------------------------
问题就出现在这儿,在方法前加 synchronized 关键词实际上是给该对象加上了对象锁,也就是说当前对象执行该方法到时候必须要获取到当前对象的锁,才能继续执行。一个对象的锁,在一个时刻只能被一个
线程获取。也就是说当线程A占有着对象personA的锁的时候,线程B是拿不到personA的锁的,那么它也就不能执行对象personA的synchronized 方法,因此该段代码是线程安全的。
既然提到了这个话题,就接着往下面扯一点儿。
上面的代码当线程threadA在执行对象personA的add方法的时候,线程B不能再执行personA的add方法,因为它没有该对象的锁。此时,线程B虽然不能执行personA的add方法,但是它可以执行 personSet
psersonB的add方法。
--待续--
标签:
原文地址:http://www.cnblogs.com/zzti08/p/4647689.html