首页 > 其他分享 >锁-优化篇

锁-优化篇

时间:2023-12-09 23:44:17浏览次数:29  
标签:加锁 vector 线程 mode JVM 自旋 优化

适应自旋锁:自旋时间不固定

  • 在Java中,自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。
  • 锁竞争是kernal mode下的,会经过user mode(用户态)到kernal mode(内核态) 的切换,是比较花时间的。
  • 自旋锁出现的原因是人们发现大多数时候锁的占用只会持续很短的时间,甚至低于切换到kernal mode所花的时间,所以在进入kernal mode前让线程等待有限的时间,如果在此时间内能够获取到锁就避免了很多无谓的时间,若不能则再进入kernal mode竞争锁。
  • 在JDK 1.6中引入了自适应的自旋锁,说明自旋的时间不固定,要不要自旋变得越来越聪明。
  • 自旋锁在JDK1.4.2中就已经引入,只不过默认是关闭的,可以使用-XX:+UseSpinning参数来开启,在JDK1.6中就已经改为默认开启了。

锁消除:如果发现代码是线程安全的,将锁去掉

如果JVM明显检测到某段代码是线程安全的(言外之意:无锁也是安全的),JVM会安全地原有的锁消除掉!
例如:
Vector是默认加锁的,但JVM如果发现vector变量仅仅在vectorTest()方法中使用,那该vector是线程安全的。JVM会把vector内部加的锁去除,这个优化就叫做:锁消除。

    public static void vectorTest() {
        Vector<String> vector = new Vector<String>();
        for (int i = 0; i < 10; i++) {
            vector.add(i + "");
        }

        System.out.println(vector);
    }

锁粗化:加锁范围过小(重复加锁),将加锁的范围扩展

  • 默认情况下,总是推荐将同步块的作用范围限制得尽量小。
  • 但是如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体中的,频繁地进行互斥同步操作也会导致不必要的性能损耗。
  • JVM会将加锁的范围扩展(粗化),这就叫做锁粗化。

轻量级锁:在无竞争的情况下使用CAS操作去消除同步使用的互斥量

  • 轻量级锁能提升程序同步性能的依据是“对于绝大部分的锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。
  • 如果没有竞争,轻量级锁使用CAS操作避免了使用互斥量的开销但如果存在锁竞争,除了互斥量的开销外,还额外发生了CAS操作,因此在有竞争的情况下,轻量级锁会比传统的重量级锁更慢。
  • 简单来说:如果发现同步周期内都是不存在竞争,JVM会使用CAS操作来替代操作系统互斥量。这个优化就被叫做轻量级锁。

偏向锁:在无竞争环境下,把整个同步都消除,CAS也不做。

  • 偏向锁就是在无竞争的情况下把整个同步都消除掉,连CAS操作都不做了!
  • 偏向锁可以提高带有同步但无竞争的程序性能。它同样是一个带有效益权衡(Trade Off)性质的优化,也就是说,它并不一定总是对程序运行有利,如果程序中大多数的锁总是被多个不同的线程访问,那偏向模式就是多余的。在具体问题具体分析的前提下,有时候使用参数-XX:-UseBiasedLocking来禁止偏向锁优化反而可以提升性能。

标签:加锁,vector,线程,mode,JVM,自旋,优化
From: https://www.cnblogs.com/nxjblog/p/17892023.html

相关文章

  • 百度翻译优化之后
    packagecom.example;importcom.google.gson.JsonArray;importcom.google.gson.JsonObject;importcom.google.gson.JsonParser;importokhttp3.*;importorg.json.JSONException;importorg.json.JSONObject;importjavax.swing.*;importjava.awt.*;importjava.awt.event......
  • 通信工程项目中网络优化研究——LW
    选题背景通讯系统工程是一个具有高科技含量的专业知识密集型系统工程,其特点在于信息的快速发展,使得它具有较强的时效性。然而,与其他类型的系统工程不同,通信工程受到许多因素的制约,因此,在进一步优化通信工程时,不宜仅仅依靠成本和进度等策略。一般通信工程中大多数设备都具有不可移......
  • 函数递归求n个数的最大公因数(优化版)
    #include<stdio.h>intret(intx,inty){  inti=1;  if(x%y==0||y%x==0)   return(x>y?y:x);  else  {    while(x%y!=0)    {      i=x%y;      x=y;     ......
  • n个数算最小公倍数(优化版)
    #include<stdio.h>intret(intx,inty){  inti=1;  if(x%y==0||y%x==0)    return(x>y?x:y);  else  {   for(i=1;i<=x*y;i++)    {      i=x*i;      if(i%y==0) ......
  • 深入研究与优化目标检测算法,以提高其性能与适用性的探索性研究
    基于深度学习的目标检测算法分为2类:TwoStage和OneStage。TwoStage:先预设一个区域,改区域称为regionproposal,即一个可能包含待检测物体的预选框(简称RP),再通过卷积神经网络进行样本分类计算。流程是:特征提取->生成RP->分类/回归定位。常见的TwoStage算法有:R-CNN、SPP-Net、Fa......
  • element tree 优化线条树,添加增删改功能
    需求:树状结构,支持操作功能(同级、子级、修改、删除)。根据需求是否展示复选框和操作功能。封装linetree.vue组件:1<template>2<div>3<el-tree:data="list":props=defaultProps:expand-on-click-node="false":default-expand-all="true"4......
  • 前端图片最优化压缩方案
    functioncompressImg(file,quality){varqualitys=0.52if(parseInt((file.size/1024).toFixed(2))<1024){qualitys=0.85}if(5*1024<parseInt......
  • 多开工具对应用程序性能的影响与优化
    多开工具对应用程序性能的影响与优化摘要:随着计算机技术的不断发展,多开工具逐渐成为一种常见的软件应用。然而,使用多开工具可能会对应用程序的性能产生一定的影响。本文将探讨多开工具对应用程序性能的影响,并提供一些优化方法,以改善应用程序在多开环境下的表现。引言:多开工具......
  • 体育产业中的图像识别创新:运动分析与训练优化
     在现代体育产业中,图像识别技术正成为一项重要的创新,为运动员的表现分析、训练优化和比赛策略提供了全新的视角。以下是体育产业中图像识别创新的一些关键应用和优势:1. 运动员动作分析:动作精准度评估: 图像识别技术可用于捕捉运动员的关键动作,分析动作的精准度和流畅度,为提高......
  • 4点搞定Type-C接口的PCB可制造性设计优化!
    Type-C接口逐渐显现出成为未来主流接口的趋势,连一贯坚持用lighting接口的苹果手机也转向使用Type-C接口。Type-C接口具有支持正反插、体积更小、传输速度更快、支持更大的功率传输等优点,因此广泛应用于各种电子设备,包括智能手机,笔记本电脑,平板电脑等。今天我们研究研究如何卓越打......