@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 的真正含义的更多相关文章

  1. synchronized实现原理

    线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...

  2. 深入理解Java并发之synchronized实现原理

    深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入 ...

  3. synchronized关键字的用法总结

    synchronized关键字主要有以下这3种用法: 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代 ...

  4. 深入理解并发编程之----synchronized实现原理

    版权声明:本文为博主原创文章,请尊重原创,未经博主允许禁止转载,保留追究权 https://blog.csdn.net/javazejian/article/details/72828483 [版权申 ...

  5. synchronized 详细解说

    转自  http://blog.csdn.net/javazejian/article/details/72828483 出自[zejian的博客] 写的很详细很好,做下记录 本篇主要是对Java并发 ...

  6. Java基础之Synchronized原理

    思维导图svg: https://note.youdao.com/ynoteshare1/index.html?id=eb05fdceddd07759b8b82c5b9094021a&type ...

  7. Java 多线程与并发【原理第一部分笔记】

    Java 多线程与并发[原理第一部分笔记] Synchronized synchronized的基本含义以及使用方式 在Java中线程安全问题的主要诱因就是存在共享数据(也称为临界资源)以及存在多条线 ...

  8. synchronized 与 volatile 区别 还有 volatile 的含义

    熟悉并发的同学一定知道在java中处理并发主要有两种方式: 1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到. 2,volatile修饰符的使用,相信这个修饰符大家平时在项目 ...

  9. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

随机推荐

  1. 《深入理解 Java 虚拟机》读书笔记:早期(编译期)优化

    正文 Java 语言的 3 类编译器: 前端编译器:把 java 文件 转变成 class 文件.例如:Sun 的 Javac. JIT 编译器(即时编译器):后端运行期编译器,把字节码转变成机器码. ...

  2. scrapy框架在未登录模式下爬取文本,文件和图片的几点收获

    1.什么是API接口? https://baijiahao.baidu.com/s?id=1597881116201407882&wfr=spider&for=pc 2.spider文 ...

  3. spring的ioc依赖注入的三种方法(xml方式)

    常见的依赖注入方法有三种:构造函数注入.set方法注入.使用P名称空间注入数据.另外说明下注入集合属性 先来说下最常用的那个注入方法吧. 一.set方法注入 顾名思义,就是在类中提供需要注入成员的 s ...

  4. 推荐一款优秀的web自动化测工具

    在业务使用的自动化测试工具很多.有开源的,有商业化的,各有各得特色,各有各得优点!下面我就介绍几个我用过的一款非常优秀的国产自动化测试工具.在现有的自动化软件当中,都是以元素的name.id.xpat ...

  5. Django HttpResponse

    HttpResponse 概述:给浏览器返回数据 HttpRequest对象是由django创建的,HttpResponse对象由程序员创建 用法 1:不调用模板,直接返回数据. 例: def get ...

  6. Nuget多项目批量打包上传服务器的简明教程

    本篇不会介绍Nuget是什么,如何打包上传Nuget包,怎么搭建私有Nuget服务器.这些问题园子里都有相应的文章分享,这里不做过多阐述.另外本文假设你已经下载了Nuget.exe,并且已经设置好了环 ...

  7. HTTP、TCP、IP协议面试题

    HTTP.TCP.IP协议基本定义 HTTP: (HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2 ...

  8. latex中文支持ubuntu

    latex安装: sudo apt install texlive-full 中文字体安装: sudo apt-get install latex-cjk-all      字体包中包含bsmi,bk ...

  9. Android菜单(menu)

    Android  菜单 我们继续来进行学习,今天写一下在软件中用的还算较多的菜单. 1.Menu 菜单,很显然,作用就是点击不同的选项触发不同的方法.现在在安卓使用中推荐使用ActionBar,但这里 ...

  10. 《Mathematical Analysis of Algorithms》中有关“就地排列”(In Situ Permutation)的算法分析

    问题描述 把数列\((x_1,x_2,\cdots,x_n)\)变换顺序为\((x_{p(1)},x_{p(2)},\cdots,x_{p(n)})\),其中\(p\)是\(A=\{1,2,3,\cd ...