Synchronized关键字整理

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

posted @   乡秀树i  阅读(213)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示