Java synchronized到底锁住的是什么?
使用环境:多线程java程序中。
作用:在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。
使用:synchronized锁住的是括号里的对象,而不是代码。对于非static的synchronized方法,锁的就是对象本身也就是this。
通过以下两个案例说明:
//包含了synchronized 方法的类 public class SynchronizedMethod {public synchronized void test(){System.out.println("线程开始..");try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}System.out.println("线程结束..");} }//测试类 public class MyThread extends Thread{public void run(){SynchronizedMethod clazz = new SynchronizedMethod();clazz.test();}public static void main(String[] args) {for(int i=0;i<3;i++){Thread thread = new MyThread();thread.start();}}} 执行结果:
线程开始..
线程开始..
线程开始..
线程结束..
线程结束..
线程结束..
分析上述执行结果可知:
当main方法执行时,分别创建了三个MyThread对象,而这三个对象又各自创建了独立的 SynchronizedMethred类,虽然使用了test方法使用了synchronized方法修饰,但是synchronized锁住的是三个独立的对象,因为三个对象各自分别执行了test方法。
因此,可以修改代码,让三个线程使用同一个SynchronizedMethod对象:
1 //修改测试类代码如下,使用同一对象调用test方法 2 3 public class MyThread extends Thread{ 4 5 /** 6 * Author:LearnAndGet 7 */ 8 private SynchronizedMethod sync; 9 public MyThread(SynchronizedMethod sync) 10 { 11 this.sync = sync; 12 } 13 14 public void run(){ 15 sync.test(); 16 } 17 18 19 public static void main(String[] args) { 20 SynchronizedMethod sync = new SynchronizedMethod(); 21 for(int i=0;i<3;i++) 22 { 23 MyThread thread = new MyThread(sync); 24 thread.start(); 25 } 26 } 27 } 运行结果:
线程开始..
线程结束..
线程开始..
线程结束..
线程开始..
线程结束..
分析上述结果:由于每次新线程启动,使用的同一对象sync,因此synchronized生效了。
当然,更常用的方法是:使用schronized锁住这个类对应的Class对象:
public class SynchronizedMethod {public void test(){//将代码块使用synchronized锁住synchronized(SynchronizedMethod.class){System.out.println("线程开始..");try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}System.out.println("线程结束..");}} }
使用上述代码后,即使每次创建不同的SynchronizedMethod对象,执行其test方法时,因为synchronized锁住了SynchronizedMethod类对应的class对象,所以每次只能有一个SynchronizedMethod的对象获取锁,直到该锁获得释放,其他SynchronizedMethod对象都无法执行其方法。
上述代码中,通过使用 synchronized(SynchronizedMethod.class)实现了全局锁的效果
除此之外,使用 static synchronized一起修饰方法时,static方法可以直接类名加方法名调用,方法中无法使用this,所以它锁的不是this,而是类的Class对象,所以,static synchronized方法也相当于全局锁,相当于锁住了代码段。
转载于:https://www.cnblogs.com/LearnAndGet/p/9365752.html
Java synchronized到底锁住的是什么?相关推荐
- Java Synchronized 重量级锁原理深入剖析上(互斥篇)
前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...
- Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程
前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...
- 透彻理解 Java synchronized 对象锁和类锁的区别
synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁.这两者的区别我用代码来演示下: 对象锁和类锁是不同的锁, ...
- 【转】【MySQL】事务与锁(四):行锁到底锁住的是什么?记录?字段?索引?
首先我们有三张表t1,t2,t3,它们都是只有两个字段, int类型的id和varchar类型的name:区别是t1没有索引,t2有主键索引,t3有唯一索引. 再强调一次,在实验前必须提前关闭自动提交 ...
- java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】
平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...
- Java synchronized偏向锁、轻量级锁、重量级锁
简介 synchronized锁共有偏向锁.轻量级锁.重量级锁三种类型,而这三种类型的加锁方式都是相同的,写代码时不用考虑加哪种锁.使用锁时对象首先会变为偏向锁状态,当有其它线程获取锁时会升级为轻量级 ...
- java synchronized关键字锁和锁类型、锁升级过程讲解
概述 synchronized是java的一个关键字,用于对方法或者代码块添加一个同步锁,以实现操作的原子性,保证线程安全性,但是却会带来一些性能上的损耗. 这个关键字添加的是可重入锁,也就是同一个线 ...
- JAVA synchronized关键字锁机制(中)
synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选. 下面总结其特性以及使用技巧,加深对其理解. 特性: 1. Java语言的关键字,当它用来修饰一个方法或者一个代码块 ...
- Java synchronized偏向锁后hashcode存在哪里?
今天的文章从下面这张图片开始,这张图片Java开发们应该很熟悉了 我们都知道无锁状态是对象头是有位置存储hashcode的,而变为偏向锁状态是没有位置存储hashcode的,今天我们来通过实现验证这个 ...
最新文章
- JAVA获取资源的方法
- Watcher 实现机制之client注冊
- 重磅!Spring Boot 2.5.0火热发布,还学得动吗?
- Hive _分桶及抽样查询
- [设计模式]迪米特法则
- C#设计模式之单例模式
- SMS部署操作系统后记
- 95-40-014-生产者-KafkaProducer
- 微信机器人wxpy简单实例Python
- 用户控件与自定义控件
- liux环境下配置jdk
- matlab经验分布函数 教程,经验分布函数.ppt
- 北风修仙笔记—2020年6月
- 前端 Coder 手中的 Docker
- php 远程下载木马
- 逆透视变换车道线检测
- 离散数学计算机专业论文,计算机与离散数学论文.doc
- 计算机毕业设计(附源码)python校园招聘管理系统
- php办公网聊天室,使用phpFreeChat在您的网站上运行聊天室 | MOS86
- 微信聊天视频25M压制指南
热门文章
- 每个前端工程师都应该去了解的前端面试题总结(一)
- 【Vue】组件的创建以及 data methods 属性的使用
- 入门机器学习(六)--课后作业解析-logistics回归(python实现)
- 浅说机器学习中“迭代法”
- python tcp服务器模板_python socket之tcp服务器与客户端示例
- Integer进制转换
- ESRI ArcGIS 9.0系列软件报价(转)
- BZOJ1095: [ZJOI2007]Hide 捉迷藏(动态点分治)
- 用户不在sudoers文件中,此事将被报告
- PHP7 网络编程(四)signal信号【待】