来源

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. 一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待(对应第1、5种情况)
  2. 每个实例都对应有自己的一把锁,不同实例之前互不影响;

    例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象共用同一把类锁(对应2、3、4、6种情况)
  3. 无论是方法正常执行完毕或者方法抛出异常,都会释放锁(对应第7种情况)

性质

1、可重入:

​ 同一个线程的外层函数获取锁后,内层函数可以直接再次获取该锁。

2、不可中断

原理

1、加锁和释放锁的原理:Monitor

2、可重入原理:加锁次数计数器

3、可见性原理:内存模型图

缺点

1、效率低

  • 锁的释放情况少
  • 视图获取锁时不能设置超时时间
  • 不能中断一个正在视图获取锁的线程

2、灵活度较差

  • 加锁和释放锁的时机单一
  • 每个锁仅有单一的对象

3、无法知道是否成功获取到锁

注意点

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

2、尽量使用JUC包下的类,再考虑Synchronized,再考虑Lock

Synchronized介绍的更多相关文章

  1. 内置锁(一)synchronized 介绍与用法

    一.synchronized 的介绍   synchronized 是 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码,而这段代码也被称 ...

  2. 计算机程序的思维逻辑 (66) - 理解synchronized

    上节我们提到了多线程共享内存的两个问题,一个是竞态条件,另一个是内存可见性,我们提到,解决这两个问题的一个方案是使用synchronized关键字,本节就来讨论这个关键字. 用法 synchroniz ...

  3. synchronized 原理分析

    synchronized 原理分析 1. synchronized 介绍    在并发程序中,这个关键字可能是出现频率最高的一个字段,他可以避免多线程中的安全问题,对代码进行同步.同步的方式其实就是隐 ...

  4. 剑指Offer——线程同步volatile与synchronized详解

    (转)Java面试--线程同步volatile与synchronized详解 0. 前言 面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现 ...

  5. 知识点:synchronized 原理分析

    synchronized 原理分析 1. synchronized 介绍 在并发程序中,这个关键字可能是出现频率最高的一个字段,他可以避免多线程中的安全问题,对代码进行同步.同步的方式其实就是隐式的加 ...

  6. Java编程的逻辑 (66) - 理解synchronized

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  7. 【J2SE高速进阶】——多线程之synchronized

    我和老婆去银行取钱 有一天,和老婆打了个赌.如今我的银行账号里共同拥有5000块钱.我们去银行同一时候取钱,看我俩能不能同一时候取出5000来....(PS:打赌的代价是:假设都能取出5000,那这1 ...

  8. 【并发编程】synchronized的使用场景和原理简介

    1. synchronized使用 1.1 synchronized介绍 在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁.但是,随着Java SE 1.6对sy ...

  9. java 并发——synchronized

    java 并发--synchronized 介绍 在平常我们开发的过程中可能会遇到线程安全性的问题,为了保证线程之间操作数据的正确性,我们第一想到的可能就是使用 synchronized 并且 syn ...

随机推荐

  1. <td>标签clospan和rowspan 可横跨列数和行数

    <td colspan="2"> <input type="text" name="reason_other" size= ...

  2. django基础一:web、wsgi、mvc、mtv

    一.web框架 web框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以快速开发特定的系统.他山之石,可以攻玉.python的所有web框架,都是对so ...

  3. Java 线程--继承java.lang.Thread类实现线程

    现实生活中的很多事情是同时进行的,Java中为了模拟这种状态,引入了线程机制.先来看线程的基本概念. 线程是指进程中的一个执行场景,也就是执行流程,进程和线程的区别: 1.每个进程是一个应用程序,都有 ...

  4. hdu 3466 Proud Merchants 01背包变形

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  5. Spring课程 Spring入门篇 5-4 advice应用(上)

    1 解析 1.1 通知执行顺序 2 代码演练 1 解析 1.1 通知执行顺序 aop执行方式为:前置通知==>所要增强的方法==>后置通知==>最终通知 在出现异常时会进行:前置通知 ...

  6. Docker安装和状态查询指令

    1 .安装 Docker $ yum install -y docker-engine 2.启动docker $systemctl start docker.service 3.验证安装是否成功(有c ...

  7. vuex的初始化

    创建store文件夹 1.功能:放异步操作 文件:actions.js 内容: 2.功能:获取state里数据 文件:getters.js 内容: export const singer = stat ...

  8. vs生成的exe程序和相关dll打包

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50782897   打包工具:Inno Setup 编译器  源文件 :vs生成的.exe和 ...

  9. Android Studio图形基础(AS开发实战第二章学习笔记)

    图形基础 一.drawable 在代码中引用drawable文件可分为两种情况 (1)使用setBackgroundResource和setImageResource方法,可直接在参数中指定drawa ...

  10. 利用canvas来绘制一个会动的图画,欢迎指教

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...