Java中的‘锁’- synchronized、ReentrantLock、ReentrantReadWriteLock

1、隐式锁 对称线程同步 synchronized

    用法:1、在方法声明时使用;2、修饰代码块中使用

    隐式规则

        1、当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行

        2、当一个线程访问object的一个synchronized(this)同步代码块时,其他的线程可以访问该object中的非synchronized(this)同步代码块

        3、synchronized(this)设置的对象锁中,当一个线程访问获取到锁,其他线程对object中相同对象锁的代码块都无法访问

    性能和执行效率:

        同步方法体<同步代码块 <synchronized(this)<同步代码块(byte锁)

    如图1-2

img_2a2dd86debe67f11e941690c595f072d.png
图1-2

    关于效率高低的判断,其实记住一点,锁时一个对象,加锁和释放锁都需要资源,对象越小效率越高 

2、显式锁Lock和ReentrantLock

Lock只是一个接口,它规定了锁的基础操作规范

如图2-1所示

img_b7ed491f5407908f54392958517116ef.png
图2-1

        1、Lock()方法,线程获取锁,如果锁不可用,则禁用当前线程,在获得锁之前,该线程一直处于休眠

        2、unlock()方法,释放锁,一般情况下,每个获取的锁都要对应一个释放锁

img_dea55c21808622a33690e9e1ce9b0cfc.png

    其他的方法像是lockInterruptibly、tryLock、tryLock(long time, TimeUnit unit)这几个方法无非就是在获取锁的过程中判断了一些条件,这里需要注意的是,方法中的锁一定要是共有的,如果是独立的锁,那么起不到相应的作用

3、显示锁,读写锁ReadWriteLock和ReentrantReadWriteLock

        ReadWriteLock是一个接口,只有两个方法,readLock()和writeLock(),此处注意,ReadWriteLock并不是Lock的子接口,但是ReadWriteLock中的读写锁都是依靠Lock来进行实现的

读写锁的机制:

    1、读读不互斥:多线程读,并发不堵塞

    2、读写互斥:有线程在写,那么所有的读线程就会堵塞,反过来,有读的线程在使用,写线程就会堵塞

    3、写写互斥:写线程都是互斥的,两个线程去写,谁先拿到锁,就先写

img_c7c31fe441a193782126c657da0b1285.png
图3-1

图3-1中是同时使用读写锁的时候的业务场景,比较经典的缓存场景

img_73d2a5821fc1f120f15148635996c0d9.png
图3-2
img_c83094bd51f551882fc3390daa8e10dd.png
图3-3

图3-2和图3-3则是模拟高并发的情况下的读写锁单独使用的情况下,图3-2的是模拟高并发的单元测试代码,图3-3是读写锁的代码

读写锁和普通锁的区别,

    1、相同点:其实都是一种显式锁,手动加锁和解锁,都比较适合高并发场景

    2、不同点:ReentrantReadWriteLock是对ReentrantLock的一种扩展,ReentrantReadWriteLock适合更加复杂的业务场景,可以实现一个方法的读写分离

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/652734

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。