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 ...
随机推荐
- 记一次使用cmd执行java文件遇到的坑...包括“使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题”
今天写了一个java文件,类似聊天软件的东西.在eclipse里输入输出显得没感觉,于是乎就准备在cmd里输入和显示输出.如下图,我准备运行的是ChatDemo.class文件.路径是:D:\work ...
- html发展史简介(摘抄)
1993年,IETF,Internet工程任务组(Internet Engineering Task Force)的简写.IETF又叫互联网工程任务组,成立于1985年底,是全球互联网最具权威的技术标 ...
- Visual Studio Code调试electron主进程
Visual Studio Code调试electron主进程 作者: jekkay 分类: electron 发布时间: 2017-06-11 14:56 一·概述 此文原出自[水滴石]: htt ...
- [acm 1002] 浙大 Fire Net
已转战浙大 题目 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2 浙大acm 1002 #include <iostre ...
- 4.Linux文件系统层次体系标准
这是不完整的linux文件系统层次体系标准,不是所有Linux发行版都根据这个标准,但大多数都是: 目录 评论 / 根目录,万物起源. /bin 包含系统启动和运行所必须的二进制程序. /boot 包 ...
- beifencode
package com.hesheng.myapplication; import android.content.Context;import android.graphics.Bitmap;imp ...
- IIS并发连接数限制
- 关于ios 10 的新的部分
编译器Xcode 8.2.1 SDK 10.2 1. 关于麦克风,相机,相册等部分的权限,需要在info.plist内进行设置,否则会出现crash.
- mongodb数据库索引管理
1:ensureIndex() 方法 MongoDB使用 ensureIndex() 方法来创建索引. 语法 ensureIndex()方法基本语法格式如下所示: }) 语法中 Key 值为你要创建的 ...
- [问题记录]cocos2dx编译打包apk过程&问题记录
目录: 1. 入门 2. 编译 3. 问题 4. 总结 5. 参考 ------------------------------------------------------------------ ...