synchronized 的真正含义
@synchronized 锁的永远是对象 ,只针对于对象,只能锁对象,常量等是不能加synchronized,一旦加编译也不会通过
@synchronized 锁对象中的非static 就是锁调用该方法的对象,是整个对象
@synchronized 锁对象中的static 方法就是锁整个类 ,和 synchronized(x.class) 和 锁静态代码块 三者都是一样的 就是锁 类加载器 给这个类 的 对象,记住这个类对象不是我们自己new 这个类的对象,而是 jvm 给这个类加载时用的对象,2这不一样。
@synchronized 锁一个对象中属性的话,这个属性必须也是对象,不能是常量,比如集合等,那synchronized(集合)就和这个对象没什么关系了,因为这个集合虽然是在这个对象里,但是 synchronized 针对的是 对象,是锁住的这个对象,即这个集合对象,所以和这个属性所在的大对象是没什么关系的,也就是说锁 大对象中的某个属性小对象时,那个大对象中的其他属性或者方法都是可以访问的,不受那个锁小对象的影响。
@ 一个对象中的非static 方法被锁住后,该对象的其他的非锁的属性或者方法都仍然是可以访问的。
总结:synchronized 锁的是对象,锁对象和锁对象中方法是一样的都是锁的对象,而且每个对象有且仅有一把锁,这个特点就决定锁只针对 加 synchronized 的代码块而言(有synchronized锁的对象、属性、方法),没synchronized 的对象或者属性、方法都仍然可以调用,因为锁既然能称为锁,只会在想锁东西时才会起作用,一个对象将锁用了,另外一个线程想来拿这个对象锁就拿不到,在前边用锁的线程释放锁前一直处于阻塞状态,这就是锁的特点和作用。打个比方就如果一个大房子里有很多小隔间,这些大隔间就是对象,对象的众多方法就是那些小隔间,对象的属性就是这大房子的一些家具之内的,整个大房子只有一把锁,不管是哪个线程是直接通过锁这个大房子还是通过锁小隔间都只有一个结果就是把这个对象的唯一的一把锁给拿走了,再它把钥匙还回来前,别人都是进步了这个房间的,当然这些都是针对于 synchronized 锁下的代码块而言。
注:既然上边说锁 一个对象 ,那同对象其他的非锁方法或者索性是扔然可以拿到的,那假如军团战中 玩家刷积分 和玩家自己调整得积分 是 2个线程,这个积分是线程共有的,即这个积分涉及 线程不安全的,那我现在 是在 加积分的方法里 给这个积分所在对象此命名为A 加锁,这个锁有用么?因为虽然对象加锁了,但是这个对象里的其他属性和方法只要是非锁的仍然可以访问,也就是其他线程仍然可以调用 A对象中的set积分方法,因为这个set积分方法是 无锁的,那这边锁A是不是起不到什么作用?那我要想保证积分线程安全,那我是不是必须要在set积分上加锁才行,但是如果我仅仅在set积分上加锁,但是 我假如2个线程都要set积分,因为 set积分肯定是先拿到当前积分后+上本次所得积分 得到一个总值才会去set 积分,那我这2个线程都 运行到get积分后,而且2个拿到的当前积分都一样,但都没有执行set积分方法了,现在来执行set积分方法,就算这个set积分方法有锁,其实也没有用,因为我2个线程拿当前积分就已经错了,已经不同步了,所以难道还要在get积分上也加锁,但想想就算都在get和set积分上加锁,这2个方法之间总有间隔,有间隔就会出现不同步,就不能保证积分 不安全,那这个积分怎么办呢?
其实上边锁 那个积分所在对象 A 是可以的,为啥说可以的呢,因为 虽然A中有set积分的方法,但这个方法目前只有在这个统一加积分的方法里调用,此命名为B方法,现在在B方法里加了锁A的代码,因为整个功能积分的改动只有在这个B方法里有改动,也就是说任何线程 要想改积分都是调用这个B方法,那我在这个B方法里将整个A对象给锁住,然后在锁块里先get积分然后set积分就没问题了,因为其他 线程 要想改积分也是调用这个同一个B方法,而B方法里有synchronized 锁A的代码,第一个线程抢到锁A的钥匙时可以执行,其他的线程由于抢不到锁A的钥匙,在执行到synchronized(A) 即也想把A锁住这边是执行不了的,因为它没有钥匙,不能先开锁然后再把A锁起来,所以后来的抢不到钥匙的线程只能等待。
synchronized 的真正含义的更多相关文章
- synchronized实现原理
线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...
- 深入理解Java并发之synchronized实现原理
深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...
- synchronized关键字的用法总结
synchronized关键字主要有以下这3种用法: 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代 ...
- 深入理解并发编程之----synchronized实现原理
版权声明:本文为博主原创文章,请尊重原创,未经博主允许禁止转载,保留追究权 https://blog.csdn.net/javazejian/article/details/72828483 [版权申 ...
- synchronized 详细解说
转自 http://blog.csdn.net/javazejian/article/details/72828483 出自[zejian的博客] 写的很详细很好,做下记录 本篇主要是对Java并发 ...
- Java基础之Synchronized原理
思维导图svg: https://note.youdao.com/ynoteshare1/index.html?id=eb05fdceddd07759b8b82c5b9094021a&type ...
- Java 多线程与并发【原理第一部分笔记】
Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...
- synchronized 与 volatile 区别 还有 volatile 的含义
熟悉并发的同学一定知道在java中处理并发主要有两种方式: 1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到. 2,volatile修饰符的使用,相信这个修饰符大家平时在项目 ...
- 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition
img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...
随机推荐
- 爬虫 | Python下载m3u8视频
目录 从 m3u8 文件中解析出 ts 信息 按时间截取视频 抓取 ts 文件 单文件测试 批量下载 合并 ts 文件 将合并的ts文件转化为视频文件 参考资料: m3u8格式介绍 ts文件格式介绍 ...
- eclipse操作快捷键
Eclipse最全快捷键,熟悉快捷键可以帮助开发事半功倍,节省更多的时间来用于做有意义的事情. Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ ...
- python之路---装饰器函数
阅读目录 楔子 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 返回顶部 楔子 作为一个会写函数的python开发,我们从今天开始要去公司上班 ...
- 前端CSS学习笔记
一 CSS介绍 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(超文本标记语言)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言.CSS不仅可以 ...
- laravel的中间件创建思路
网上有很多解析laravel中间件的实现原理,但是不知道有没有读者在读的时候不明白,作者是怎么想到要用array_reduce函数的? 本文从自己的角度出发,模拟了如果我是作者,我是怎么实现这个中间件 ...
- 多线程之旅(Thread)
在上篇文章中我们已经知道了多线程是什么了,那么它到底可以干嘛呢?这里特别声明一个前面的委托没看的同学可以到上上上篇博文查看,因为多线程要经常使用到委托.源码 一.异步.同步 1.同步(在计算的理解总是 ...
- 从ISTIO熔断说起-轻舟网关熔断
最近大家经常被熔断洗脑,股市的动荡,让熔断再次出现在大家眼前.微服务中的熔断即服务提供方在一定时间内,因为访问压力太大或依赖异常等原因,而出现异常返回或慢响应,熔断即停止该服务的访问,防止发生雪崩效应 ...
- Jmeter接口测试之用户自定义变量(九)
在使用Jmeter做接口自动化测试中,经常会使用到公共的数据,那么就需要对这些公共的数据分离出来,不管是基于测试框架的思想,还是使用工具来进行做自动化测试,公共数据的分离首先是需要思考的.这里就以获取 ...
- python之openpyxl模块(最全总结 足够初次使用)
openpyxl模块 Python_Openpyxl 1. 安装 pip install openpyxl 2. 打开文件 ① 创建 from openpyxl import Workbook # 实 ...
- [bzoj]1059矩阵游戏<二分图匹配*匈牙利算法>
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 初见此题,我觉得这是水题,我认为只要每一行和每一列至少存在一个黑格就可以出现对角线, ...