同步锁(lock)

有两种机制防止代码块受并发访问的干扰:

1、一个是使用synchronized关键字。

2、使用ReentrantLock类。(通过显示定义同步锁对象来实现同步。)

同步锁(lock)方法是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前先获得Lock对象。

Lock、ReadWriteLock(读写锁)是java 5 提供的两个根接口。别为Lock接口提供了ReentrantLock(可重入锁)实现类;为ReadWriteLock接口提供了ReentrantReadWriteLock实现类。

在实现线程安全的控制中,比较常用的是ReentrantLock(可重入锁)。使用该Lock对象可以显示地加锁、释放锁。

 

 1 import java.util.*;
 2 import java.util.concurrent.locks.ReentrantLock;
 3 public class Other extends Thread{
 4     private Account account;
 5     private double drawAmount;
 6     //private String name;
 7     public Other(Account account,double drawAmount,String name){
 8         super(name);//必须是第一语句
 9         this.account=account;
10         this.drawAmount=drawAmount;
11         start();
12     }
13     public void run(){
14         for(int i=0;i<15;i++){
15         account.draw(drawAmount);
16         }
17     }
18     public static void main(String[] args){
19         Account a=new Account("刘腾",10000);
20         Other o=new Other(a,1000,"A");
21         Thread t=new Thread(new RunnableClass(a));
22         t.setName("B");
23         t.start();
24     }
25 }
26 class Account{
27     //定义锁对象
28     private final ReentrantLock lock=new ReentrantLock();
29     private String name;
30     private double money;
31     public Account(){}
32     public Account(String name,double money){
33         this.name=name;
34         this.money=money;
35     }
36     public double getMoney(){
37         lock.lock();
38         try{
39         return money;}
40         finally{
41         lock.unlock();
42         }
43     }
44     public void draw(double drawAmount){
45         lock.lock();
46         try{
47             if(money>=drawAmount){
48                 System.out.println(name +"取钱成功!吐出钞票:"+drawAmount);
49                 try{
50                         Thread.sleep(1000);
51                 }catch(Exception e){
52                     System.out.println(e);
53                 }
54                 money-=drawAmount;
55                 System.out.println("余额为:"+getMoney());
56             }else{
57                 System.out.println("取钱失败!余额不足!");
58             }
59         }finally{
60             lock.unlock();
61         }
62     }
63 }
64 class RunnableClass implements Runnable{
65     private Account account;
66     //private double drawAmount;
67     public RunnableClass(Account account){
68         this.account=account;
69         //this.drawAmount=drawAmount;
70     }
71     public void run (){
72         for(int k=0;k<10;k++){
73         try{
74         Thread.sleep(1000);
75         System.out.println(Thread.currentThread().getName()+"读取钱数为:"+account.getMoney());}
76         catch(Exception e){}
77         }
78     }
79 }

需要导入import java.util.concurrent.locks.ReentrantLock;

 

转载于:https://www.cnblogs.com/teng-IT/p/4450001.html

【第78题】JAVA高级技术-多线程12(同步锁-lock) 同步锁 阅读详情

相关推荐

Java 同步锁(synchronized)详解及实例

主要介绍了Java 同步锁(synchronized)详解及实例的相关资料,需要的朋友可以参考下

深入了解Lock同步锁的优化

与RRW不一样的是,StampedLock控制锁有三种模式: 写、悲观读以及乐观读,并且StampedLock在获取锁时会返回一个票据stamp,获取的stamp除了在释放锁时需要校验,在乐观读模式下,stamp还会作为读取共享资源后的二次校验。我们可以发现:一个写线程获取写锁的过程中,首先是通过WriteLock获取一个票据stamp,WriteLock是一个独占锁,同时只有一个线程可以获取该锁,当一个线程获取该锁后,其它请求的线程必须等待,当没有线程持有读锁或者写锁的时候才可以获取到该锁。

775

别再被手机厂商忽悠了!一文看懂光学变焦、数字变焦和混合变焦到底有啥区别

本文深入解析手机摄影中的光学变焦、数字变焦和混合变焦技术,揭示它们的工作原理和实际效果差异。光学变焦保持无损画质,数字变焦依赖算法放大,而混合变焦结合两者优势。帮助消费者识破厂商宣传,根据实际需求选择最适合的变焦方式,提升拍摄质量。

weixin_28717969的博客 414

Synchronized Lock 锁 同步

如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系。 字符串作为锁对象的参考 一、synchronized的性质 1、可重入性 官方解释:指的是同一线程的外层函数获得锁之后,内层函数可以直接再次获得该锁; 通俗解释:获得一次锁之后,如果调用其它同步方法,不需要重新获取锁,可以直接使用; 在方法1中调用方法2,两个方法都是同步方法,在获取方法1的锁之后,是可以直接调用方法2,而不需要重新获取锁,这就是可重入性,可重入性是线程范围,可以...

qq_30436011的博客 3587

如何免费访问和使用Gemini API?

Gemini Ultra具有最先进的性能,在几个指标上超过了GPT-4的性能。它是第一个在大规模多任务语言理解基准测试中超越人类专家的模型,该基准测试57个不同学科的世界知识和解决问题的能力。Gemini是谷歌迄今为止开发的最先进、最庞大的AI模型。它为多模态而建,理解并处理不同类型的数据,比如文本、代码、音频、图像和视频。下面我们将加载Masood Aslami的图像,并用它来测试Gemini Pro Vision的多模态性。有了Gemini可以为查询提供图像、音频和文本,获得几乎完美的答案。

java_cjkl的博客 1万+

Seafile搭建以及onlyoffice在线办公

部署seafile docker-compose.yml 如下: 参考此篇文章 version: '2.0' services: db: image: mariadb:10.1 container_name: seafile-mysql environment: - MYSQL_ROOT_PASSWORD=db_dev # mysql root的密码,同时修改 seafile的DB_ROOT_PASSWD与这个一致 - MYSQL_LOG_CONSOLE

dwdcth的专栏 4659

Java线程Lock同步锁

创建一个ReentrantLock实例作为锁对象。然后,我们创建两个线程t1和t2,它们都会调用acquireLock()方法获取锁并执行同步的代码块。最后,我们可以看到两个线程交替地获取到锁、执行同步代码块并释放锁。

左--右 1307

emir分析RC corner如何选择

power analysis阶段 RC corner的选择

weixin_61954252的博客 3596

多线程-同步问题

1

qq_33879443的博客 464

JOOQ用法和实例

jOOQ,是一个ORM框架,利用其生成的Java代码和流畅的API,可以快速构建有类型约束的安全的SQL语句。jOOQ的核心优势是可以将数据库表结构映射为Java类,包含表的基本描述和所有表字段。通过jOOQ提供的API,配合生成的Java代码,可以很方便的进行数据库操作生成的Java代码字段类型是根据数据库映射成的Java类型,在进行设置和查询操作时,因为是Java代码,都会有强类型校验,所以对于数据的输入,是天然安全的,极大的减少了SQL注入的风险。

m0_67403076的博客 1378

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1103

synchronized/Lock锁详解

synchronized和Lock锁如何使用,demo笔记,一文搞懂!

但行好事,莫问前程 1734

AWS S3文件上传性能优化:Java SDK多线程与分段上传实战指南

本文详细介绍了如何通过Java SDK优化AWS S3文件上传性能,重点讲解多线程并发上传与分段上传(Multipart Upload)技术的实战应用。通过动态调整分段策略、线程池配置及内存优化技巧,可显著提升大文件上传效率,实测显示组合方案比单线程上传提速近5倍。文章还涵盖加密上传、断点续传等高级场景解决方案,并提供了完整的性能对比测试数据。

d6e7f8的博客 1017

多线程之锁优化(中):深入了解Lock同步锁的优化方法

不管使用Synchronized同步锁还是Lock同步锁,只要存在锁竞争就会产生线程阻塞,从而导致线程之间的频繁切换,最终增加性能消耗。因此,如何降低锁竞争,就成为了优化锁的关键。在Synchronized同步锁中,我们了解了可以通过减小锁粒度、减少锁占用时间来降低锁的竞争。在这一讲中,我们知道可以利用Lock锁的灵活性,通过锁分离的方式来降低锁竞争。

echohuangshihuxue的博客 1369

PCL 点云格式转换【2024最新版】

常见点云格式转化汇总包括txt、stl、csv、ply、obj、xyz、las等。博客长期更新,本文最近一次更新时间为:2024年9月14日,代码更新至PCL1.14.1版本。

点云侠的博客 39万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java 同步锁 lock 高级用法_Java lock同步锁使用实例解析

这篇文章主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,...

weixin_42528222的博客 302

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

5.JUC-lock同步锁

一)Lock同步锁 1.Lock是jdk1.5之后提供的显示同步锁 优点:更加的灵活 使用Lock加锁需要使用lock上锁,unlock解锁,而且解锁的必须要执行所以一般将解锁放在的finally中 实例演示卖票 1.未加锁状态 /** * @project_name:juc * @date:2019/9/27:19:50 * @author:shinelon * @Describe:测试...

失忆๑的博客 159

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java同步锁Synchronzied和Lock的区别

同步锁 java内置同步锁,每个java对象都可以用作同步锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获取锁的唯一途径就是进入同步方法和同步代码块。 java同步锁是一个互斥锁,只能有一个线程获取该锁,当线程A要获取B线程持有的对象锁的时候,只能在等待队列中等待,当B代码执行完毕释放锁,A才能获取该锁。如果B线程不释放锁,A线程会一直等待。 synchronzied和lock的区别 1.synchronzied是java内置的关键字..

lihuarui的专栏 538

06 同步锁 Lock

同步锁 Lock 用于解决线程安全问题的方式: 1.1 synchronized:隐式锁 (1) 同步代码块 (2)同步方法 1.2 Lock同步锁:显示锁 (1) 需要通过 lock() 方法上锁; (2) 必须通过 unlock() 方法释放锁。 ReentrantLock 实现了 Lock 接口,并提供了与 synchronized 相同的互斥性和内存可见性。但相较于synchronized 提供了更高的处理锁的灵活性。 示例: import java.util.concurrent.lo

朱古力的博客 144

同步锁 syncharonized 和 Lock——学习笔记

同步锁 synchronized 可以锁对象,锁住的一定是公用的对象,可共用的资源,this指代当前对象可以锁。锁同一个对象时,该对象就会被加上同步锁,被加上同步锁的对象,在synchronized代码块没有执行结束之前,其他的线程,哪怕自己的类创建的其他线程,都不能再对加了锁的代码块有任何的访问。 可以锁类型 锁类型 , 范围大 ,不特指哪一个, 其实锁的就是类加载器,锁类型的过程就...

qq_40875544的博客 479

深入了解Lock同步锁的优化方法

在 JDK1.5 之后,Java 还提供了 Lock 同步锁。那么它有什么优势呢? 相对于需要 JVM 隐式获取和释放锁的 Synchronized 同步锁,Lock 同步锁(以下简称 Lock 锁)需要的是显示获取和释放锁,这就为获取和释放锁提供了更多的灵活性。Lock锁的基本操作是通过乐观锁来实现的,但由于 Lock 锁也会在阻塞时被挂起,因此它依然属于悲观锁。 从性能方面上来说,在并发量不高、竞争不激烈的情况下, Synchronized 同步锁由于具有分级锁的优势,性能上与 Lock ...

木卯的专栏 243

简单分析Synchronized(同步锁)、Lock

Synchronized(同步锁) 在Java中使用多线程,同步锁这个概念是十分重要的。 平时的开发过程中,你必然会遇到一个问题:多个线程共享一个或者一组资源,这资源包括内存、文件等,在多个线程对这组资源进行读写操作时,如何保持数据的准确性同步一致,这是至关重要的。 很常见的一个例子是,张三在银行账户存有1000元,李四和张三同时对这个账号在不同取款机多次的存取100,在这

fangleijiang的专栏 637

java同步锁实例_Java lock同步锁使用实例解析

这篇文章主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,...

weixin_42333411的博客 337

java线程第六课:同步锁Lock

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Re...

王强的专栏 367

7.Lock 同步锁

7.Lock 同步锁Lock( 锁 )从 JDK 5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。java.util.con...

DevOps海洋的渔夫@专栏 467

java多线程(同步锁-lock)

java多线程(同步锁-lock)

weixin_59796310的博客 448
上一篇: 同步锁(lock)
下一篇: java中死锁
aixirang3421
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值