Synchronized关键字整理

作用:能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全效果。

两个用法:

1、对象锁:

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

2、类锁:

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

概念:

l  只有一个Class对象:Java类可能有多个java对象,但只有一个Class对象。

l  本质:所谓的类锁,不过是Class对象锁而已。

l  用法和效果:类锁只能在同一时刻被一个对象拥有。

性质:

  1. 可重入

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

l  好处:避免死锁、提升封装性。

l  粒度:是线程范围而非调用范围。

l  原理:加锁次数计数器。线程第一次给对象加锁时,设为1,。每当该线程在此对象上再次获得锁时,计数递增。当任务离开时,计数递减,为0时,完全释放锁。

  1. 不可中断

缺陷:

l  效率低:锁的释放情况少、试图获得锁时不能设定超时、不能中断一个正在试图获得锁的线程。

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

l  无法知道是否成功获取到锁。

多线程访问同步方法的7种情况:

  1. 两个线程同时访问一个对象的同步方法。(同步)
  2. 两个线程访问的是两个对象的同步方法。(非同步)
  3. 两个线程访问的是synchronized的静态方法。(同步)
  4. 同时访问同步方法和非同步方法。(非同步方法不受到影响)
  5. 访问同一个对象的不同的普通同步方法。(同步)
  6. 同时访问静态synchronized和非静态synchronized方法。(非同步,锁不同)
  7. 方法抛异常后,会释放锁。

总结

l  一把锁只能同时被一个线程获取,没有拿到锁的线程必须等待(对应1,5的情况)

l  每个实例都对应有自己的一把锁,不同实例之前互不影响;例外:锁对象是*.class以及synchronized修饰的是static方法的时候,所有的对象共用一把类锁(对应2,3,4,6种情况)

l  无论是方法正常执行完毕或者方法抛出异常,都会释放锁。(对应第7种情况)

可见性原理:

课程代码地址:

https://github.com/daxiong1224/concurrency_demo/tree/master

Synchronized关键字整理的更多相关文章

  1. Java并发编程之synchronized关键字

    整理一下synchronized关键字相关的知识点. 在多线程并发编程中synchronized扮演着相当重要的角色,synchronized关键字是用来控制线程同步的,可以保证在同一个时刻,只有一个 ...

  2. Java中synchronized关键字理解

    好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式 ...

  3. 从JAVA看C#中volatile和synchronized关键字的作用

    最近一直在想C#中 volatile关键字到底是用来干什么的?查了很多.NET的文章都是说用volatile修饰的变量可以让多线程同时修改,这是什么鬼... 然后查到了下面这篇JAVA中关于volat ...

  4. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  5. java中synchronized关键字的用法

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  6. 深入理解java中的synchronized关键字

    synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D ...

  7. synchronized关键字,Lock接口以及可重入锁ReentrantLock

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

  8. Java synchronized关键字用法(清晰易懂)

    本篇随笔主要介绍 java 中 synchronized 关键字常用法,主要有以下四个方面: 1.实例方法同步 2.静态方法同步 3.实例方法中同步块 4.静态方法中同步块 我觉得在学习synchro ...

  9. volatile与synchronized关键字

    volatile关键字相信了解Java多线程的读者都很清楚它的作用.volatile关键字用于声明简单类型变量,如int.float.boolean等数据类型.如果这些简单数据类型声明为volatil ...

随机推荐

  1. jquery的on()绑定无效的方式

    on前面的元素也必须在页面加载的时候就存在于dom里面.动态的元素或者样式等,可以放在on的第二个参数里面 jQuery on()方法是官方推荐的绑定事件的一个方法.使用 on() 方法可以给将来动态 ...

  2. ASP.NET中在后台用C#,往前台插入HTML代码

    //你的div加ID号,然后写上runat="server",变成服务器端控件,然后后台可以直接用ID号.innerhtml="html内容",这样就可以了 & ...

  3. numpy.ndarray常用属性和方法

    import numpy as np a = np.array([[1,2,3],[4,3,2],[6,3,5]])print(a) [[1 2 3] [4 3 2] [6 3 5]] print(a ...

  4. Lightoj1014【基础题】

    题意: 有C个人,安排了P个吃的,每个人会吃Q个吃的,最后留下L个吃的:求所有可能的Q,从小到大输出,要保证Q>L; 思路: 其实就是求出P-L的所有数的约数,然后这个约数>L的话就满足: ...

  5. 3DMAX 7 角色建模1 人头建模

    说明: mesh与poly 可编辑多边形是一个多边形网格:即与可编辑网格不同,其使用超过三面的多边形.可编辑多边形非常有用,因为它们可以避免看不到边缘.例如,如果您对可编辑多边形执行切割和切片操作,程 ...

  6. Node.js 使用Stream的pipe(管道)方法实现文件复制

    Stream模块有一个pipe方法,可以将两个流串起来,实现所有的数据自动从Readable流进入Writable流 "use strict"; const fs = requir ...

  7. Elasticsearch学习记录(分布式的特性)

    Elasticsearch学习记录(分布式的特性) 分布式的特性 我们提到Elasticsearch可以扩展到上百(甚至上千)的服务器来处理PB级的数据.然而我们的例子只给出了一些使用Elastics ...

  8. log4j2中LevelRangeFilter的注意点

    LevelRangeFilter的注意点 在log4j2中,LevelRangeFilter的minLevel,maxLevel的配置是和log4j 1.x相反的:minLevel需要配置的是高级别, ...

  9. 采集-telegraf

    1 介绍 Telegraf是一款Go语言编写的metrics收集.处理.聚合的代理其设计目标是较小的内存使用,通过插件来构建各种服务和第三方组件的metrics收集Telegraf由4个独立的插件驱动 ...

  10. 最短路之Dijkstra(单源)HDU 2544

    #include <iostream> using namespace std; ; ][]; ]; int middist; ]; void dijkstra(int n,int m) ...