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

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

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

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

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

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

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

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

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

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

锁的粒度更小了,也解决了这个问题,确实可以的。wQc28资讯网——每日最新资讯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代码块变为区分读写场景的读写锁,也可以考虑悲观锁和乐观锁的区分。wQc28资讯网——每日最新资讯28at.com

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

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

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

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

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

1、公平锁

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

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

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

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

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

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

标签:
  • 热门焦点
Top