首页 > 编程语言 >Java笔记(六):锁

Java笔记(六):锁

时间:2023-05-22 14:55:05浏览次数:45  
标签:Java Synchronized Lock 笔记 获取 线程 公平 lock

传统的Synchronized锁

Synchronized 通过为方法或代码块添加互斥锁,来保证线程安全性。 持有相同锁的多个线程,同一时间只有一个线程能够拿到锁并执行锁定的代码块或方法。

public synchronized void run(){ // do something }

Lock锁

接口Lock的实现类:

  • ReentractLock
  • ReentractReadWriteLock.ReadLock
  • ReentractReadWriteLock.WriteLock
public void run(){
  lock.lock();
  try{
    // do something 
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    lock.unlock();
  }
}

非公平锁

非公平锁(Unfair Lock)是一种线程同步机制,与公平锁(Fair Lock)相对应。在多线程环境中,公平锁会按照线程的申请顺序来获取锁资源,即先到先得的原则。而非公平锁则不考虑线程的申请顺序,允许新来的线程插队获取锁资源,从而可能导致已经在等待的线程长期等待。

非公平锁的设计主要是为了提高系统的整体吞吐量和性能。由于公平锁要求按照申请顺序获取锁资源,如果一个线程获取锁资源的时间较长,那么其他已经准备好并且在等待的线程就必须一直等待。这样会导致线程频繁地从用户态和内核态之间切换,增加了上下文切换的开销,降低了系统的吞吐量。

相比之下,非公平锁允许新来的线程插队获取锁资源,避免了等待时间过长的情况,减少了线程的等待时间和上下文切换的开销,从而提高了系统的整体性能和吞吐量。然而,由于非公平锁的设计特点,可能会导致某些线程一直无法获取到锁资源,造成不公平现象。

选择使用公平锁还是非公平锁需要根据具体的场景和需求来决定。如果对线程的公平性要求较高,并且能够容忍一定的性能损失,可以选择公平锁。如果追求系统的整体性能和吞吐量,并且能够接受一些线程的不公平性,可以选择非公平锁。

Synchronized 和 Lock 的区别

https://xie.infoq.cn/article/4e370ded27e4419d2a94a44b3

标签:Java,Synchronized,Lock,笔记,获取,线程,公平,lock
From: https://www.cnblogs.com/Bota5ky/p/17420613.html

相关文章

  • [Java] JDK与Spring国际化支持
    0序言在Springcontext与SpringIoC对ApplicationContext以及Context相关的设计模式进行了介绍。ApplicationContext作为一个Context在应用的运行层提供了IoC容器、事件、国际化等功能接口。Spring的国际化(i18n)功能是通过MessageSource接口实现的,他提供了MessageSource::getM......
  • python学习笔记32:操作sqlite数据库
    importsqlite3#1.创建数据库连接#如果test.db存在,则建立连接,返回connect对象#如果test.db不存在,则新建数据库,再建立连接,返回connect对象conn=sqlite3.connect(database='test.db')#2.创建cursor对象cursor=conn.cursor()#SQL指令sql='''......
  • 【Java】引用传递?值传递?
    引用传递和值传递,从上学那会儿就开始强调的概念,不管你是计算机相关专业还是自学Java,一定听过这么一句话:方法调用参数如果是对象,那就是引用传递,如果是基本数据类型,就是值传递。比如:function(Objecto)就是引用传递,function(inti)就是值传递。这两个概念似乎很好理解,我们只需要记......
  • 【iOS开发】UIWebView调用JS点击事件(stringByEvaluatingJavaScriptFromString)
    一、场景描述产品需求是移动端app要调用h5页面,然后监听h5代码中的某个方法,最终执行h5中的具体代码。二、具体代码.m文件@interfaceViewController()<UIWebViewDelegate>@property(nonatomic,strong)UIWebView*webView;@end@implementationViewController-(void)viewDid......
  • Vue脚手架笔记备注
    笔记脚手架文件结构├──node_modules├──public│├──favicon.ico:页签图标│└──index.html:主页面├──src│├──assets:存放静态资源││└──logo.png││──component:存放组件││└──HelloWorld.vue│......
  • Java入门9(HashSet,File文件类)
    HashSetjdk1.7之前,使用数组加链表的方式实现jdk1.8之后,在链表长度大于8并且数组长度超过32的情况下,会转成红黑树结构HashSet的本质是一个HashMap,它所有的value都是一致的,传入的参数作为key,因此HashSet中不允许重复数据存储的时候,键值对位于的数组位置,之和key的HashCode值有关......
  • java通用xls导出设计
    背景在后端日常开发中总会有各种各样的导出需求,实现这个需求必须要解决的两个问题:1、表头不能直接使用字段名,需要显示为中文,甚至还需要考虑国际化2、值需要翻译,比如性别、状态之类的字段现状现在主流写的比较好的方法是定义一个对象,对象上用自定义的注解+easytrans我的解决......
  • Java使用HttpClient以multipart/form-data向接口上传文件
    前言对接某公司的接口,涉及到资质上传等业务。需要对接他们的上传附件接口。JDK1.8httpclient4.x封装httpclient方法publicstaticStringpostFileMultiPart(Stringurl,Map<String,ContentBody>reqParam)throwsIOException{ CloseableHttpClienthttpclient=HttpCl......
  • 信息收集学习笔记总结
    1.域名信息(来自csdn)在渗透测试过程中,一般在目标的主站很少有发现漏洞点的存在,这时候我们就要从从主站之外的接口进行渗透测试,这时我们可以从域名出发收集信息。(1)端口一个网站可能会开放多个不同的端口,而我们可以通过同一网站的不同端口进行测试,扫描开放端口的......
  • 基于springBoot框架JAVA语言汽车销售管理系统功能实现
    运行环境idea(推荐)、jdk1.8、mysql5.X(不能为8驱动不匹配)、maven项目技术springboot+vue项目描述本项目基于springboot以及Vue开发。针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管理。1.安装好node环境2.......