当前位置:首页 > 科技  > 软件

简单聊一聊公平锁和非公平锁,Parallel并行流

来源: 责编: 时间:2023-10-08 07:05:59 432观看
导读大家好,我是哪吒。上一章提到了一个关于 i++ 和 ++i 的面试题打趴了所有人,最终方案是在两个方法上添加synchronized关键字,从而避免i++的线程安全问题,不过,这样真的好吗?在所有有线程安全的方法都添加synchronized?答案是

Jz228资讯网——每日最新资讯28at.com

大家好,我是哪吒。Jz228资讯网——每日最新资讯28at.com

上一章提到了一个关于 i++ 和 ++i 的面试题打趴了所有人,最终方案是在两个方法上添加synchronized关键字,从而避免i++的线程安全问题,不过,这样真的好吗?在所有有线程安全的方法都添加synchronized?Jz228资讯网——每日最新资讯28at.com

答案是显而易见的,不行。Jz228资讯网——每日最新资讯28at.com

synchronized会极大的降低程序的性能,导致整个程序几乎只能支持单线程操作,性能显著降低。Jz228资讯网——每日最新资讯28at.com

那么,如何解决呢?Jz228资讯网——每日最新资讯28at.com

一、降低锁的粒度,将synchronized关键字不放在方法上了,改为synchronized代码块。

锁的粒度更小了,也解决了这个问题,确实可以的。Jz228资讯网——每日最新资讯28at.com

package com.guor.thread;public class SynchronizedTest2 {    int a = 1;    int b = 1;    public void add() {        System.out.println("add start");        synchronized (this) {            for (int i = 0; i < 10000; i++) {                a++;                b++;            }        }        System.out.println("add end");    }    public synchronized void compare() {        System.out.println("compare start");        synchronized (this) {            for (int i = 0; i < 10000; i++) {                boolean flag = a < b;                if (flag) {                    System.out.println("a=" + a + ",b=" + b + "flag=" + flag + ",a < b = " + (a < b));                }            }        }        System.out.println("compare end");    }    public static void main(String[] args) {        SynchronizedTest2 synchronizedTest = new SynchronizedTest2();        new Thread(() -> synchronizedTest.add()).start();        new Thread(() -> synchronizedTest.compare()).start();    }}

为了更好的优化,有的时候可以将synchronized代码块变为区分读写场景的读写锁,也可以考虑悲观锁和乐观锁的区分。Jz228资讯网——每日最新资讯28at.com

对于读写场景比较多的情况,可以使用ReentrantReadWriteLock区分读写,再次降低锁的粒度,提高程序的性能。Jz228资讯网——每日最新资讯28at.com

ReentrantReadWriteLock 还可以选择提供了公平锁,在没有明确必须使用公平锁的情况下,尽量不要使用公平锁,公平锁会使程序性能降低很多很多。Jz228资讯网——每日最新资讯28at.com

二、先区分一下公平锁和非公平锁

  • 公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一个得到锁。
  • 非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,进入等待队列,如果能获取到,就直接获取到锁。

简单来说,公平锁(谁先排队,谁先执行),非公平锁(不用排队,每个人都有机会)。Jz228资讯网——每日最新资讯28at.com

1、公平锁

有一天早上,云韵、美杜莎、小医仙结伴去买酱香拿铁,到了咖啡店,先排队,一个一个来。不一会,哪吒来了,也买酱香拿铁,只能在末尾排队。这个就是公平锁。Jz228资讯网——每日最新资讯28at.com

Jz228资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12358-0.html简单聊一聊公平锁和非公平锁,Parallel并行流

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 你真的理解Python Qt6基础知识中的信号和槽机制吗?

下一篇: 有了这个代码模板,合并排序手到擒来

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top