Synchronized介绍
来源
https://www.imooc.com/learn/1086
作用
同步方法支持一种简单的策略来防止线程干扰和内存一致性错误,如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成的。
即:能够保证在同一时刻最多只有一个线程执行该段代码,达到保证并发安全的效果。
Synchronized是Java的关键字,被Java原生支持。
是最基本的互斥同步手段。
用法
- 对象锁
- 方法锁(锁对象为this当前实例对象)
- 同步代码锁(自己指定锁对象)
- 类锁:只有一个Class对象
- synchronized修饰静态方法
- 指定锁为Class对象
多线程访问同步方法的7种情况
1、两个线程同时访问一个对象的同步方法
串行执行
2、两个线程访问的是两个对象的同步方法
并行方法,不是一个对象。
3、两个线程访问的是synchronized的静态方法
串行执行,只有一个Class对象
4、同时访问同步方法和非同步方法
并行执行
5、访问同一个对象的不同的普通同步方法
串行,this是同一个
6、同时访问静态synchronized和非静态的synchronized方法
并行执行,锁对象不是同一个
7、方法抛出异常后,释放锁
synchronized会自动释放,Lock等不会
三个核心思想
- 一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待(对应第1、5种情况)
- 每个实例都对应有自己的一把锁,不同实例之前互不影响;
例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象共用同一把类锁(对应2、3、4、6种情况) - 无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)
性质
1、可重入:
同一个线程的外层函数获取锁后,内层函数可以直接再次获取该锁。
2、不可中断
原理
1、加锁和释放锁的原理:Monitor
2、可重入原理:加锁次数计数器
3、可见性原理:内存模型图
缺点
1、效率低
- 锁的释放情况少
- 视图获取锁时不能设置超时时间
- 不能中断一个正在视图获取锁的线程
2、灵活度较差
- 加锁和释放锁的时机单一
- 每个锁仅有单一的对象
3、无法知道是否成功获取到锁
注意点
1、锁对象不能为空、作用域不宜过大、避免死锁
2、尽量使用JUC包下的类,再考虑Synchronized,再考虑Lock
Synchronized介绍的更多相关文章
- 内置锁(一)synchronized 介绍与用法
一.synchronized 的介绍 synchronized 是 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码,而这段代码也被称 ...
- 计算机程序的思维逻辑 (66) - 理解synchronized
上节我们提到了多线程共享内存的两个问题,一个是竞态条件,另一个是内存可见性,我们提到,解决这两个问题的一个方案是使用synchronized关键字,本节就来讨论这个关键字. 用法 synchroniz ...
- synchronized 原理分析
synchronized 原理分析 1. synchronized 介绍 在并发程序中,这个关键字可能是出现频率最高的一个字段,他可以避免多线程中的安全问题,对代码进行同步.同步的方式其实就是隐 ...
- 剑指Offer——线程同步volatile与synchronized详解
(转)Java面试--线程同步volatile与synchronized详解 0. 前言 面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现 ...
- 知识点:synchronized 原理分析
synchronized 原理分析 1. synchronized 介绍 在并发程序中,这个关键字可能是出现频率最高的一个字段,他可以避免多线程中的安全问题,对代码进行同步.同步的方式其实就是隐式的加 ...
- Java编程的逻辑 (66) - 理解synchronized
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 【J2SE高速进阶】——多线程之synchronized
我和老婆去银行取钱 有一天,和老婆打了个赌.如今我的银行账号里共同拥有5000块钱.我们去银行同一时候取钱,看我俩能不能同一时候取出5000来....(PS:打赌的代价是:假设都能取出5000,那这1 ...
- 【并发编程】synchronized的使用场景和原理简介
1. synchronized使用 1.1 synchronized介绍 在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁.但是,随着Java SE 1.6对sy ...
- java 并发——synchronized
java 并发--synchronized 介绍 在平常我们开发的过程中可能会遇到线程安全性的问题,为了保证线程之间操作数据的正确性,我们第一想到的可能就是使用 synchronized 并且 syn ...
随机推荐
- 前端定位Position属性四个值
1.static(静态定位):默认值.没有定位,元素出现在正常的流中. 2.relative(相对定位):生成相对定位的元素,通过top,bottom,left,right的设置相对于其正常(原先本身 ...
- linux 安装php扩展swoole redis
本文讲的是已经有redis.so 和swoole.so文件的情况 我的环境是xampp php的扩展目录为 /opt/lampp/lib/php/extensions/no-debug-non-zts ...
- 抽象工厂模式的C++、Java实现
1.抽象工厂模式UML 图1. 抽象工厂模式的UML 2.C++实现 C++实现类图为: 图2. 抽象工厂模式的C++实现类图 其中,AbstractFactory的实现代码为: //抽象工厂类基类. ...
- org.apache.ibatis.binding.BindingException
1.异常提示: org.apache.ibatis.binding.BindingException: Mapper method 'com.artup.dao.WorksDao.selectWork ...
- OSGEarth加载 geoserver 发布 TMS
geoserver配好数据并用自带的gwc切片好后, 访问 http://localhost:9999/geoserver/gwc/service/tms/1.0.0/ 在OsgEarth的earth ...
- win7 64 位安装 python,提示: 0x80240017-未指定的错误
首先确保从python官网下载正确的python版本: https://www.python.org/downloads/windows/ 然后,应该是 VC 相关的问题. 去微软网站下载下列补丁包即 ...
- IE的兼容性设置 X-UA-Compatible
< meta http-equiv = "X-UA-Compatible" content = "IE=edge,chrome=1" /> 是IE8 ...
- 仿照jQuery进行一些简单的框架封装(欢迎指教~)
(function(window,undefined){ var arr = [], push = arr.push, slice = arr.slice; //首先要做的就是封装一个parseHtm ...
- java中复制数组的5种方法
“=”,相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变.,这一种勉强算是吧 使用FOR循环,将数组的每个元素复制或者复制指定元素,不过效率差一点 ...
- 查询SQL Server 版本信息
select SERVERPROPERTY('ProductVersion') as ProductionVersion, SERVERPROPERTY('ProductLevel')as Produ ...