java 对象锁和类锁的区别
1.一个类可以有多个对象,所以一个类可以有多个对象锁。
2.当一个类中有多个synchronized修饰的同步方法时,其中一个方法被线程访问持有锁,其他方法同样被锁住,其他线程依然不能访问其他同步方法,因为此时锁住的是该类的对象,相当于整个对象锁住了。
3.一个类只能有一个.claas,所有一个类只能有一个类锁。
首先的明白java中锁的机制
synchronized 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默认是当前对象作为锁的对象. 在修饰类时候默认是当前类的Class对象作为锁的对象.
方法锁(synchronized修饰方法时)
通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。
synchronized 方法控制对类成员变量的访问: 每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。
对象锁(synchronized修饰方法或代码块)
当一个对象中有synchronized method或synchronized block的时候调用此对象的同步方法或进入其同步区域时,就必须先获得对象锁。如果此对象的对象锁已被其他调用者占用,则需要等待此锁被释放。(方法锁也是对象锁) java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待;synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。这里也体现了用synchronized来加锁的1个好处,方法抛异常的时候,锁仍然可以由JVM来自动释放。
对象锁的两种形式:
public class Test
{
// 对象锁:形式1(方法锁)
public synchronized void Method1()
{
System.out.println(“我是对象锁也是方法锁”);
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}// 对象锁:形式2(代码块形式)
public void Method2()
{synchronized (this){System.out.println("我是对象锁");try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}}
}
类锁(synchronized 修饰静态的方法或代码块)
由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只有一份。所以,一旦一个静态的方法被申明为synchronized。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。 对象锁是用来控制实例方法之间的同步,类锁是用来控制静态方法(或静态变量互斥体)之间的同步。 类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的。 java类可能会有很多个对象,但是只有1个Class对象,也就是说类的不同实例之间共享该类的Class对象。Class对象其实也仅仅是1个java对象,只不过有点特殊而已。由于每个java对象都有1个互斥锁,而类的静态方法是需要Class对象。所以所谓的类锁,不过是Class对象的锁而已。获取类的Class对象有好几种,最简单的就是[类名.class]的方式。
public class Test
{
// 类锁:形式1
public static synchronized void Method1()
{
System.out.println("我是类锁一号");
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}// 类锁:形式2
public void Method2()
{synchronized (Test.class){System.out.println("我是类锁二号");try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}}
}
文章来源于:类锁和对象锁的区别
java 对象锁和类锁的区别相关推荐
- Java锁Synchronized对象锁和类锁区别(搬运)
java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...
- 透彻理解 Java synchronized 对象锁和类锁的区别
synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁.这两者的区别我用代码来演示下: 对象锁和类锁是不同的锁, ...
- java锁方法和锁代码块_java的同步方法和同步代码块,对象锁,类锁区别
/** * @author admin * @date 2018/1/12 9:48 * 做用在同一个实例对象上讨论 * synchronized同步方法的测试 * 两个线程,一个线程调用synchr ...
- java基础---对象锁和类锁的区别
synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁. 对象锁和类锁是不同的锁,所以多个线程同时执行这2个不同 ...
- Java并发编程-八锁问题带你彻底理解对象锁和类锁
八锁问题带你理解对象锁和类锁 8锁问题演示 1.标准访问 2.在邮件方法中暂停4秒,请问先打印邮件还是短信 3.新增普通sayHello方法,请问先打印邮件还是hello 4.两部手机,请问先打印邮件 ...
- java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】
平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...
- synchronized 对象锁和类锁的区别
synchronized 对象锁和类锁的区别 synchronized 描述 一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限, 在Java里边就是拿到某个同步对象的 ...
- JUC并发编程笔记1__JUC概述、虚假唤醒问题、JUC的生产者和消费者关系、8锁问题(对象锁、类锁区别)
目录 一.回顾 概念 线程的几个状态 wait和sleep的区别 Synchronized 和 Lock的区别 二.虚假唤醒问题 举例synchronized下的生产者.消费者模式场景 三.JUC下的 ...
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- Java 对象锁和类锁全面解析
2019独角兽企业重金招聘Python工程师标准>>> 最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念. ...
最新文章
- 为什么分数是循环小数
- python设计模式之享元模式
- 实验3-3 比较大小 (10 分)
- AES-128\192\256加密算法及其安全脆弱分析
- 下载Googleearth地图作为底图显示曝光点
- 重心法例题matlab,Excel重心法选址计算题的详细步骤
- layui 表格序号累加 翻页序号也累加
- 计算机组成原理中总线包括,计算机组成原理复习题
- 深度学习入门(五) softmax回归
- 【Unity3D】Unity5打不开VS2017,Unity打开VS2017异常,并且有时候最后打开的是Mono的解决方案
- 解析下载blob视频
- 函数feof使用注意事项
- LeetCode-179-最大数
- 国产M0核风机量产程序开发方案… FOC电机控制开发方案…3电阻采样
- git 禁止分支提交
- 九头蛇3389远程爆破
- java毕业设计开题报告SSM实现的在线音乐歌曲网站音乐播放器
- 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第一场)
- 56. 数据增广 / 图像增广
- 《小说朗读器》采集功能升级