java对象锁&类锁

首先,来看一段代码。

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

--待续--

时间: 2024-07-30 10:47:12

java对象锁&类锁的相关文章

synchronized关键字以及实例锁 类锁

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 二.然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块.

Java 对象和类

1.访问实例变量和调用成员方法: 2. 在该例子中,我们创建两个类:Employee 和 EmployeeTest. 首先打开文本编辑器,把下面的代码粘贴进去.注意将文件保存为 Employee.java. Employee类有四个成员变量:name.age.designation和salary.该类显式声明了一个构造方法,该方法只有一个参数. 程序都是从main方法开始执行.为了能运行这个程序,必须包含main方法并且创建一个实例对象. 下面给出EmployeeTest类,该类实例化2个 Em

[Java学习笔记]-Java对象和类

Java是完全面向对象的高级语言,其基本的操作基本都是针对相应的对象和类.面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分.对应面向对象的语言,还有一种面向过程的语言,如C语言.面向对象的语言是在面向过程语言的基础上发展而来的.面向对象(OOP,全称为Object-Oriented-Programer,下文简称为OOP)相对于面向过程的语言而言,其优势在于很多问题的解决方法被封装在对象里,有时只需要创建这样的对象就可以解决我们的问题,而不必关心其具体实现细节,这

Java对象转xml报文和xml报文转Java对象帮助类

import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; /** * xml和java对象转换帮助类 * Cre

Java对象和类

转自原文:http://www.yiibai.com/java/java_object_classes.html java是一种面向对象的语言.由于具有面向对象特性的语言,Java支持以下基本概念: 多态性 继承 封装 抽象化 类 对象 实例 方法 消息解析 在本章中,我们将探讨类和对象这些概念. 对象 - 对象具有状态和行为.例如:狗有状态 - 颜色,名称,繁殖以及行为,摇头晃脑,吠叫,吃.对象是类的实例. 类 - 一个类可以被定义为描述行为的模板/蓝色印花/指出其类型支持的对象. Java对

java 对象与类

类与类之间的关系 一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性.在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口. 二.实现关系      实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系.在Java中此类关系通过关键字implem

java对象与类

1.构造器总是伴随着new操作符的执行而被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的. 2.静态域与静态方法 如果将类定义为static,每一个类只有一个这样的域.静态域是属于类的,而不属于任何独立的对象,其又被称为类域. 静态方法是一种不能向对象实施操作的方法,但是他可以访问自身类中的静态域. main方法也是一个静态方法,main方法不对任何对象进行操作,实际上,在启动程序时还没有任何一个对象.静态的Main方法将执行并创建所需要的对象. 3.方法参数 常见的将参数

Java对象、类、消息和特性

面向对象编程基础 ?  对象 对象object就是变量和相关的方法的集合,其中变量表明对象的状态,方法表明对象所具有的行为. 对象是有状态(数据)和行为(功能)等内容的.例如:要说明一个学生,需要提供姓名.学号.出生日期.专业.兴趣爱好等,这些用于描述对象的数据元素称为对象属性.而学生的行为会包括注册.选课.考试等,这些表示对象可能产生的操作称为对象的行为(或操作.方法). ?  类 类class中定义一类对象共有的变量和方法.把一个类实例化即生成该类的一个对象. 类(class)是同一类型对象

json字符串转java对象实体类

DpRccEntity rccData = JSON.parseObject(JSONObject.toJSONString("JSONString",DpRccEntity.class); 导入的包为:import com.alibaba.fastjson.JSON; 原文地址:https://www.cnblogs.com/huyanlon/p/10907726.html