码迷,mamicode.com
首页 > 编程语言 > 详细

java对象锁&类锁

时间:2015-07-15 12:55:55      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

首先,来看一段代码。

 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方法。

--待续--

 

java对象锁&类锁

标签:

原文地址:http://www.cnblogs.com/zzti08/p/4647689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!