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并发编程中必须要理解的一个知识点.其实使用起来还是比 ...
随机推荐
- CSS每日学习笔记(0)
7.29.2019 1. CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解 ...
- 读书笔记——莫提默·J.艾德勒&查尔斯·范多伦(美)《如何阅读一本书》
第一篇 阅读的层次 第一章 阅读的活力与艺术 阅读的目标:娱乐.获得资讯.增进理解力这本书是为那些想把读书的主要目的当作是增进理解能力的人而写.何谓阅读艺术?这是一个凭借着头脑运作,除了玩味读物中的一 ...
- CVE-2019-3396:Confluence未授权模板注入_代码执行
title: Confluence未授权模板注入/代码执行(CVE-2019-3396) tags: [poc,cve] 简介 Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企 ...
- KMP 算法简单解释
讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样 不同是在匹配失败时能利用子串的特征减少回溯,利用根据子串特征生成的Next数组来减少 <( ̄︶ ̄)↗[GO!] ...
- SpringFramework之IoC容器初始化
分析例子 启动类 Application,使用的是ClassPathXmlApplicationContext来加载xml文件 /** * @author jianw.li * @date 2020/ ...
- Selenium系列(十) - 针对Select下拉框的操作和源码解读
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Prism 源码解读3-Modules加载
介绍 在软件开发过程中,总想组件式的开发方式,各个组件之间最好互不影响,独立测试.Prism的Modules很好的满足了这一点. 这个架构图很好了讲解了Prism的Modules的概念 Prism支持 ...
- C 2012年笔试题(保)
1 程序改错 1.1 下面程序段的功能是交换两个字符数组的内容(每个字符串字符数均不超过100) (8分) [ 见2012年笔试题1.1] void StrSwap(char *pa,char ...
- spring-cloud-gateway过滤器实践
概述 这里是 SpringCloud Gateway 实践的第一篇,主要讲过滤器的相关实现.Spring-Cloud-Gateway 是以 WebFlux 为基础的响应式架构设计, 是异步非阻塞式的, ...
- 热点 | 近期Github热点项目库总结
整理 | Walker 介绍:你有没有想过你会成为一个艺术家,但无奈你不知道如何画画?得益于计算机视觉技术,你可以在ML社区轻松实现这个梦想.更棒的是,Github上ML社区的代码都是开源的! 这就是 ...