java查看对象锁级别_对象级别锁 vs 类级别锁(Java)
前言
对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指正。
对象级别锁 vs 类级别锁
我们知道由于并发会导致线程不安全的问题,此时我们手段之一采取线程同步,也就是说使得所有并发线程在执行中保持同步的过程,当方法声明为同步时,传递到同步块中的对象称之为监视器或锁定对象,如果有另外一个线程也在执行该同步方法,那么该线程将被阻塞,直到线程释放该监视器或锁定对象。我们在类中已定义的方法或块上使用synchronized关键字,同时synchronized关键字不能与类定义中的变量或属性一起使用。
对象级别锁
所谓的对象级别锁,也就是针对非静态方法执行同步块锁定,那么同步块中的监视器或锁定对象则是基于对象实例,有如下三种形式
class Test {
public synchronized void LockMethod() {
}
}
或者
class Test {
public void LockMethod() {
synchronized(this)
{
}
}
}
或者
class Test {
private final Object lock = new Object();
public void LockMethod() {
synchronized (lock) {
}
}
}
类级别锁
若在同步方法中存在静态数据,为保持静态数据线程安全,我们则需使用类级别锁,这意味着,如果在运行时有多个实例的Test,则一次只能在一个实例中的一个线程上执行一个线程LockMethod(),而所有其他实例将被其他线程锁定。针对类级别锁,那么同步块中监视器或锁定对象有如下三种形式:
class Test {
public synchronized static void LockMethod() {
}
}
或
class Test {
public void LockMethod() {
synchronized (Test.class)
{
}
}
}
或
class Test {
private final static Object lock = new Object();
public void LockMethod() {
synchronized (lock) {
}
}
}
在这里我主要是看到了上述第二种形式中所使用的锁定对象,由于java和C#语法大多相似,但是这在C#中找不到可对比的东西,我不明白这到底是什么个意思,所以就深入看了些,本以为可以直接查看源码,然而并没有任何反应,看来就是Java中天然存在的了,我去打印发现和获取实例的类名的结果是一样的,我们将这种情况翻译为className.class,这到底是什么意思呢?为何上述第二种形式就是类级别锁定从而保证线程安全了呢?
System.out.println(Test.class.toString());
System.out.println(new Test().getClass());
于是乎我想到看一下所购买的《深入理解Java虚拟机》中对于类加载原理的解释,结果发现:在类加载时机的第一阶段也就是加载阶段,虚拟机会完成3件事情,其中最后一件事情则是在内存中生成一个对应类的java.lang.Class对象,作为方法区这个类的各种数据的入口。换句话说,每个类在JVM中有且只会有唯一的一个java.lang.Class对象实例,所以我大胆猜测className.class就是获取java.lang.Class对象唯一实例的引用,如此一来就保证始终只有一个线程能够进入同步块。
总结
本节我们通过对关键字synchronized实现线程同步做了详细了解,其实并不难,这里我想表达的是看到和C#中不一样的东西,也就是className.class具体是什么意思,同时在用java实现单例模式中也有这种情况,所以详细学习了下,也做个备忘录,可能对大部分学java的童鞋而言确实很简单,我还是处于初级阶段,也是在一步步深入的学习。
关于找一找教程网
本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[对象级别锁 vs 类级别锁(Java)]http://www.zyiz.net/tech/detail-110240.html
java查看对象锁级别_对象级别锁 vs 类级别锁(Java)相关推荐
- java中对象清空值_对象的引用和清除_Java语言程
对象的引用和清除_Java语言程 4.3.3 对象的引用和清除 在创建了类的对象后,就可以使用对象.即对象使用的原则是"先创建后使用". 使用对象的方法是:通过运算符". ...
- 千里眼摄像头支持对象存储吗_对象存储适用于哪些场景?
什么是对象存储? 对象存储是一种将数据作为对象进行管理的计算机数据存储体系结构,与其他存储体系结构(例如将数据作为文件层级管理的文件系统)以及将数据作为块和扇区内的块进行管理的块存储相对.每个对象通常 ...
- mysql mvcc 隔离级别_关于 Mysql 四种隔离级别中 Lock 和 MVCC 的关系
读写锁 共享锁(share lock)| 读锁(read lock) 读锁是共享的,或者说是相互不阻塞的.多个客户在同一时刻可以同时读取同一个资源,而互不干扰 SELECT ... LOCK IN S ...
- yield方法释放锁吗_死磕Synchronized底层实现重量级锁
点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:farmerjohngit 链接:https://github.com/farmer ...
- java 多态判断非空_跳槽涨薪季面试题之java基础(一)
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 为迎接金九银十跳槽涨薪季,小编汇总了java精编版面试题,大概从java基础.java8特性.多线程.spring.springboot. ...
- java数组的clone方法_深入浅出,如何更彻底地理解Java数组的clone方法
说在前面 在进入理解clone前,我们需要对"基本数据类型"和"引用数据类型"的存储模式有一个清晰的认识. 基本数据类型,变量的内容保存的是实际的值:引用数据类 ...
- java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?
AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...
- java二级考试真题_计算机等级考试真题2(JAVA)
1. D (A)类属于JAVA语言的引用数据类型. (B)接口属于JAVA语言的引用数据类型. (C)数组属于JAVA语言的引用数据类型. (D)double不属于JAVA语言的引用数据类型. 2. ...
- java语言程序设计精编_全国精编月高等教育自学考试Java语言程序设计一试题
<全国精编月高等教育自学考试Java语言程序设计一试题>由会员分享,可在线阅读,更多相关<全国精编月高等教育自学考试Java语言程序设计一试题(12页珍藏版)>请在人人文库网上 ...
最新文章
- matlab矩阵方块网络着色imshow_matlab中用imshow()显示图像与图像矩阵的数据类型的关系...
- t-sne 流形_流形学习[t-SNE,LLE,Isomap等]变得轻松
- sql-逻辑循环while if
- 接受拒绝算法_通过算法拒绝大学学位
- TensorFlow1.1搭建自编码网络
- 威纶通触摸屏制作自定义弹出窗口的具体方法(3种)
- 一文带你完全掌握机器人DH参数建模(详细步骤+实例+代码)
- ONVIF协议基础概念
- 2019年上半年信息系统项目管理师下午案例分析真题及答案解析
- 分享一些java学习网站网址
- 统计学习之第一天(可汗学院公开课:统计学)
- 中科大少年班、26岁数学天才回国任教,刚以中科大教授之名攻破世界级难题...
- Temporary failure in name resolution错误解决方法
- 基于区块链技术nbsp;Bitt推出巴巴…
- ansys 软件安装注意事项
- Sikuli学习(一)
- 自己部署 Docker Kong
- 延时队列的几种实现方式
- 用Office2010设计T恤
- QGIS数据库菜单栏不显示“数据库”如何修复
热门文章
- 【Learning Notes】线性链条件随机场(CRF)原理及实现
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
- 汽车HUD(Head-up Display)的技术难点
- Python 获取list 中指定元素出现的次数
- Windows 系统执行Shell 脚本的方法
- INSTALL_FAILED_VERSION_DOWNGRADE
- INSTALL_FAILED_INVALID_APK
- css 伪元素::after与::before的使用
- Caused by: java.lang.IllegalStateException: View ' '
- 深入理解Java虚拟机——第二章——Java内存区域与内存溢出异常