【JAVA】synchronized关键字
最近重新梳理了下java的synchronized相关内容,希望能帮助到有需要的朋友们。
主要阐述以下几个问题:
1.非static方法前加synchronized
1 class Demo{ 2 synchronized public void doXXX(){ 3 //code… 4 } 5 }
View Code
对于这段代码,我们要考虑这几个问题:
- 理解synchronized锁的是什么?
- 如果三个线程里分别new了三个Demo对象,各自的run方法里分别执行各自Demo对象的doXXX方法,那么synchronized还起作用吗?
- 如果三个线程里共用一个Demo对象,各自的run方法里分别执行这个共用Demo对象的doXXX方法,那么synchronized还起作用吗?
在非static方法前面加synchronized,锁的是这个new出来的Demo对象的本身,也就是this。要执行doXXX方法,必须要先获取对象锁(即对象本身)。
所以,2中doXXX的对象锁来自3个不同的Demo对象,各自线程使用各自Demo对象的锁,不存在共用锁的情况,synchronized不起作用。
同理,3中doXXX的对象锁来自1个相同的Demo对象,各自线程使用同个Demo对象的锁,存在共用锁的情况,synchronized起作用。
2.方法内部synchronized同步块
1 class Demo { 2 public void doXXX(){ 3 synchronized(this){ 4 //code… 5 } 6 } 7 } 8
View Code
对于这段代码,我们需要考虑这几个问题:
- 括号里填this?
- 括号里填类.class?
- 括号里填一个对象?
synchronized锁住的是括号里的对象,而不是代码。所以多线程情况下要执行doXXX,要先获得锁,即括号里指定的内容。
分析:
- 如果填this,多线程共用同一个Demo对象时,可以控制并发操作带来的问题,如果各个线程使用各自的Demo对象时,是没有用的。
- 如果填类.class,相当于对类加锁,也就是在该类的所有成员间实现互斥,在同一时间只有一个线程可访问该类的实例(如果需要在线程间相互唤醒就需要借助Object类的wait()方法及nofity()方法),这种方法,不管各个线程使用同一个Demo对象还是使用各自的Demo对象,都可以解决并发操作带来的问题。一般用方法所在类.class或者方法所在类内部定义一个static的对象,作为锁。这种方式称为全局锁。
- 对象的情况有很多,可以来自Demo类内部(static和非static),外部传入(static和非static),但是要传哪种,相信你看完上面两条分析,心里应该有数了。
3.static方法前加synchronized
1 class Demo{ 2 public static synchronized void doXXX{ 3 //code… 4 } 5 } 6
View Code
static的synchronized方法,所以它锁的不是this,而是类的Class对象,而且方法中无法使用this。可见,这种方式不管new几个Deom调用doXXX,都不会并发。
相信你理解了上面三个问题,那么你对synchronized关键字就有了一定的了解,并能够将它运用在处理并发操作的问题上了。
-----------------------------------------------------
请尊重作者劳动成果,
转载请注明出处:http://www.cnblogs.com/ryanyu/p/6647121.html
转载于:https://www.cnblogs.com/ryanyu/p/6647121.html
【JAVA】synchronized关键字相关推荐
- java的同步关键字_简单了解Java synchronized关键字同步
简单了解Java synchronized关键字同步 发布于 2021-1-13| 复制链接 摘记: synchronized synchronized可以用来同步块,同步方法.同步块可以用来更精确 ...
- Java Synchronized 关键字
本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchron ...
- java synchronized关键字
引用其他人的一段话 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchro ...
- java synchronized关键字_Java:手把手教你全面学习神秘的Synchronized关键字
前言 在Java中,有一个常被忽略 但 非常重要的关键字Synchronized 今天,我将详细讲解 Java关键字Synchronized的所有知识,希望你们会喜欢 目录 示意图 1. 定义 Jav ...
- java synchronized关键字_Java synchronized 关键字,你用的对吗?
for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread.getName + " " + i) ...
- java synchronized 关键字(1)对象监视器为Object
在java多线程中 synchronized 是非常重要的,也是经常用到的 对于synchronized关键字要注意两点 synchronized对象监视器为Object的时候 synchroniz ...
- java synchronized关键字锁和锁类型、锁升级过程讲解
概述 synchronized是java的一个关键字,用于对方法或者代码块添加一个同步锁,以实现操作的原子性,保证线程安全性,但是却会带来一些性能上的损耗. 这个关键字添加的是可重入锁,也就是同一个线 ...
- JAVA synchronized关键字锁机制(中)
synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选. 下面总结其特性以及使用技巧,加深对其理解. 特性: 1. Java语言的关键字,当它用来修饰一个方法或者一个代码块 ...
- Java synchronized关键字实现线程同步
⭐写在前面⭐
- 【Java】synchronized关键字笔记
Java Synchronized 关键字 壹. Java并发编程存在的问题 1. 可见性问题 可见性问题是指一个线程不能立刻拿到另外一个线程对共享变量的修改的结果. 如: package Note. ...
最新文章
- ionic项目创建打包签名
- [微信小程序]手指触摸动画效果(完整代码附效果图)
- 述职答辩提问环节一般可以问些什么_2020上海市职称评审答辩注意事项
- DL之CNN:利用卷积神经网络算法(2→2,基于Keras的API-Sequential)利用MNIST(手写数字图片识别)数据集实现多分类预测
- CommonJS规范(转)
- 关于Promise.all()的理解
- 【BZOJ1042】硬币购物(动态规划,容斥原理)
- Linux中fork的秘密
- ssh 脚本 空格字符转换
- 计算2的N次方(信息学奥赛一本通-T1170)
- Spark API编程动手实战-08-基于IDEA使用Spark API开发Spark程序-01
- 陆正耀为瑞幸数据造假道歉:非常自责 会全力挽回损失
- 【报告分享】5G赋能中国智慧城市白皮书.pdf(附下载链接)
- Fortran 学习1--数据类型
- excel怎么设置打印区域_学会Excel分页符设置,打印区域自由选择
- excel如何选中空单元格并计算总计、平均值、率
- 【PHP问题解决办法】Deprecated: Function eregi() is deprecated in
- 世界杯的狂欢也是黑灰产的狂欢?
- Autodesk 3ds Max 2014选择集闪退问题
- mac接收gmail邮件_如何从您的Gmail帐户发送和接收Hotmail