synchronize在高并发领域可谓是元老级别了,博主最近整理了一下synchronize的用法,和简单的概念。

概念

对象锁:包括 方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)

类锁:指synchronized 修饰静态的方法或指定锁对象为Class对象。

用法

同步代码块锁

用this锁:

自己指定锁:

用this时,2个线程用的是同一把锁,可以保证串行执行。自定义2把锁(lock1,lock2)时,由于是2个锁对象,无法保证2个线程串行执行。

方法锁

sysnchronized 修饰普通方法

可以保证串行执行

类锁

java类可能有很多个对象,但只有1个class对象,所以所谓的类锁其实就是Class对象锁而已。(不同实例只能在同一时刻被一个对象拥有)

sysnchronized加在static方法上

sysnchronized(*.class)代码块

均可实现代码的串行化执行

常见面试题

1.两个线程同时访问一个对象的同步方法

答案:可以实现串行化执行,因为用的是同一个对象锁,为同一把锁

2.两个线程访问的是两个对象的同步方法

答案:不可以实现串行化执行。因为锁对象不同,互不干扰。

3.两个线程访问的是synchronized的静态方法

答案:可以实现串行执行。因为synchronized加在静态方法上属于类锁,是同一个对象锁。

4.同时访问同步方法和非同步方法

答案:不可以实现串行执行。非同步方法不受影响。synchronized只作用的修饰的方法上。

5.访问同一个对象的不同的普通同步方法

答案:可以实现串行。因为同一个对象,默认使用的都是this对象,为同一把锁。

6、同时访问静态synchronized和非静态synchronized方案

答案:不可以实现串行。因为静态的锁对象为类锁,非静态的为实例的对象锁,2个锁对象不同,互不影响。

7.方法抛出异常后会释放锁吗?

答案:可以的。synchronized可以在抛异常后自动被释放。lock是需要手动释放的。

性质

可重入

指的是同一个线程的外层函数获得锁之后,内层函数可以直接再次获取该锁

好处:避免死锁,提升封装性

粒度:

1.同一个方法是可以重入的

2.可重入不要求是同一个方法

3.可重入不要求是同一个类

不可中断

sysnchronized一旦这个锁已经被别人获得了,如果我还想获得,我只能等待或者阻塞,直到别的线程释放这个锁。如果别人永远不释放锁,那么我只能永远的等下去。

相比之下: lock类可以拥有中断能力,第一点,如果我觉得我等的时间太长了,有权中断现在已经获取到锁的线程的执行。第二点,如果我觉得我等待的时间太长了不想再等了,也可以退出。

原理

查看monitor指令

通过反编译字节码查看原理

.java文件

反编译:

可重入原理(加锁次数计数器)

1.jvm 负责跟踪对象被加锁的次数

2.线程第一次给对象加锁的时候,计数变为1,每当这个相同的线程在此对象上再次获得锁时,计数会递增

3.每当任务离开时,计数递减,当技术为0时候,锁被完全释放

可见性原理

当被sysnchronized修饰之后的方法,在退出前会把数据刷新的主内存,当下个方法进入时候会从主存中拿到最新的数据

缺陷

效率低:锁对象释放的情况少,试图获得锁时不能设定超时,不能中断一个正在试图获得锁的线程(lock可以)

不够灵活:加锁和释放的时机单一,每个锁仅仅有单一的条件(某个对象),可能是不够的(lock可以)

无法知道是否成功的获取锁

使用注意点:

锁对象不能为空,作用域不宜过大,避免死锁

如何选择lock和synchronized关键字(避免出错为原则)

1.如果可以都不用,而是用java.util.current包中的工具类(countdownluch。。。等)

2.如果适用,就优先使用synchronized

3.只有有必要使用lock的特性的时候才使用lock

java高并发之魂:Synchronize相关推荐

  1. Java高并发之魂:synchronized深度解析

    本文整理自慕课网的讲师悟空老师,教学地址:http://www.imooc.com/learn/1086 文章目录 一.synchronized简介 1 synchronized作用 1.1 官方翻译 ...

  2. java高并发类_Java 高并发之魂

    前置知识 了解Java基本语法 了解多线程基本知识 知识介绍 Synchronized简介:作用.地位.不控制并发的后果 两种用法:对象锁和类锁 多线程访问同步方法的7种情况:是否是static.Sy ...

  3. Java高并发之Hosee博客内容整理

    Hosee博客博客高并发系列目录 [高并发Java 一] 前言 [高并发Java 二] 多线程基础 [高并发Java 三] Java内存模型和线程安全 [高并发Java 四] 无锁 [高并发Java ...

  4. Java高并发之设计模式,设计思想

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:大道方圆 cnblogs.com/xdecode/p/913 ...

  5. Java高并发之锁优化

    本文主要讲并行优化的几种方式, 其结构如下: 锁优化 减少锁的持有时间 例如避免给整个方法加锁 1 public synchronized void syncMethod(){ 2 othercode ...

  6. Java高并发之BlockingQueue

    前言碎语 当系统流量负载比较高时,业务日志的写入操作也要纳入系统性能考量之内,如若处理不当,将影响系统的正常业务操作,之前写过一篇<spring boot通过MQ消费log4j2的日志>的 ...

  7. Java高并发之CountDownLatch源码分析

    概述 CountDownLatch 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助.简单来说,就是 CountDownLatch 内部维护了一个计数器,每个线程完成自己的操作之后都 ...

  8. java 高并发_Java 高并发之无锁(CAS)

    Java 高并发之无锁(CAS) 本篇主要讲 Java中的无锁 CAS ,无锁 顾名思义就是 以不上锁的方式解决并发问题,而不使用synchronized 和 lock 等.. 1. Atomic 包 ...

  9. Java高并发处理总结

    自己参考大牛博客及视频写了一些关于并发的感悟,高并发的处理思路,无外乎以下几种 1 代码层面: 锁优化措施(见本文内容).尽量简化事务和减少事务 2 应用层面:缓存 队列 限流 熔断 3数据库层面: ...

最新文章

  1. POJ 1170 Shoping Offers(IOI 95)
  2. @Autowired与@Resource的区别
  3. mysql搭建主主_mysql主主配置
  4. FZU 2082 过路费
  5. JavaScript-面向对象原型继承
  6. php开发视频播放顺序,请问关于php代码运行顺序问题
  7. 创业15年,我对自己第一次的反省
  8. tableau 实战练习数据源分享_数据分析实战训练营学习笔记
  9. MyEclipse移动开发教程:设置所需配置的iOS应用(四)
  10. 第五篇:你“ 看不见 ” 的隐式转换
  11. 3.代码托管仓库 - GitHub
  12. kgtemp文件转mp3工具
  13. 小和尚打水问题_操作系统进程同步问题解析(哲学家问题、生产消费问题、小和尚打水问题等大量例子)...
  14. signature=71820b070a82d48c44cc938baccfcfc9,基于集成神经网络的离线手写签名鉴别方法
  15. JAVAWEB开发之Hibernate详解(二)——Hibernate的持久化类状态与转换、以及一级缓存详解、关联关系的映射(一对多、多对多、级联)
  16. 不止终端热闹,CES 2016上半导体厂商有哪些新动作?---ESM
  17. 相机去畸变软件OCamCalib的使用方法
  18. 分布式内存网格Hazelcast源码导读
  19. SQL日期与时间类型
  20. 【项目】磁盘文件管理工具

热门文章

  1. 论参加数学建模比赛的正确姿势
  2. bitwise oracle,linq – 与NHibernate和Oracle的Bitwise AND
  3. 闪电贷攻击的深层原因:价格预言机操纵攻击
  4. Educational Codeforces Round 92 (Rated for Div. 2)题解(A-C)
  5. 【Alpha阶段】第三次scrum meeting
  6. 一切皆服务:以蓝天的角度看待云
  7. 硬件设计4---什么是电感磁珠?
  8. 甲骨文官网下载jdk历史版本
  9. 20135337朱荟潼 Linux第二周学习总结——操作系统是如何工作的
  10. 12- 定时器介绍和定时器0定时1ms