Lock-同步锁

Lock是java5提供的一个强大的线程同步机制--通过显示定义同步锁对象来实现同步。Lock可以显示的加锁、解锁。每次只能有一个线程对lock对象加锁。

Lock有ReadLock、WriteLock、ReentrantLock(可重入锁)

常用的就是ReentrantLock。代码如下:

代码逻辑:Account账户类,实现取钱的同步方法、DrawThread取钱的线程

Account:

package lock.reentrantlock2;
import java.util.concurrent.locks.*;/***账户类,需保持同步*/
public class Account
{//定义锁对象private final ReentrantLock lock = new ReentrantLock();private String accountNo;private double balance;public Account(){}public Account(String accountNo , double balance){this.accountNo = accountNo;this.balance = balance;}public void setAccountNo(String accountNo){this.accountNo = accountNo;}public String getAccountNo(){return this.accountNo;}public double getBalance(){return this.balance;}public void draw(double drawAmount){lock.lock();try{//账户余额大于取钱数目if (balance >= drawAmount){//吐出钞票System.out.println(Thread.currentThread().getName() + "取钱成功!吐出钞票:" + drawAmount);try{Thread.sleep(1);          }catch (InterruptedException ex){ex.printStackTrace();}//修改余额balance -= drawAmount;System.out.println("\t余额为: " + balance);}else{System.out.println(Thread.currentThread().getName() +"取钱失败!余额不足!");}          }finally{lock.unlock();}}public int hashCode(){return accountNo.hashCode();}public boolean equals(Object obj){if (obj != null && obj.getClass() == Account.class){Account target = (Account)obj;return target.getAccountNo().equals(accountNo);}return false;}
}

  DrawThread:

package lock.reentrantlock2;/*** 调用account取钱* */public class DrawThread extends Thread
{//模拟用户账户private Account account;//当前取钱线程所希望取的钱数private double drawAmount;public DrawThread(String name , Account account , double drawAmount){super(name);this.account = account;this.drawAmount = drawAmount;}//当多条线程修改同一个共享数据时,将涉及到数据安全问题。public void run(){account.draw(drawAmount);}
}

  TestDraw:

package lock.reentrantlock2;/***/
public class TestDraw
{public static void main(String[] args) {//创建一个账户Account acct = new Account("1234567" , 1000);//模拟两个线程对同一个账户取钱new DrawThread("甲" , acct , 800).start();new DrawThread("乙" , acct , 800).start();}
}

  运行结果:

甲取钱成功!吐出钞票:800.0
余额为: 200.0
乙取钱失败!余额不足!

使用Lock同步与同步方法很相似,都是“加锁--修改公共变量--释放锁”的模式,代码很容易看懂。两个线程对应一个Account对象,保证了两个线程对应一个lock对象,保证了同一时刻只有一个线程进入临界区。Lock还包含太容易Lock(),以及试图获取可中断锁的lockInterruptibly(),获取超时失效锁的tryLock(long,TimeUnit)等方法。

ReentrantLock锁具有可重入性可以对已被加锁的ReentrantLock锁再次加锁,线程每次调用lock()加锁后,必须显示的调用unlock来释放锁,有几个lock就对应几个unlock。还有把unlock放在finally代码块中,Lock在发生异常时也是不释放锁的,所以在finally中释放更安全。

只是对Lock简单说明了下,为下一篇线程通信打基础。

Lock同步锁--线程同步相关推荐

  1. 同步锁-线程安全问题解决方案

    1 同步锁 1.1 前言 经过前面多线程编程的学习,我们遇到了线程安全的相关问题,比如多线程售票情景下的超卖/重卖现象. 上节笔记点这里-进程与线程笔记 我们如何判断程序有没有可能出现线程安全问题,主 ...

  2. 同步锁-线程安全问题解决方法

    1 同步锁 1.1 前言 我们如何判断程序有没有可能出现线程安全问题,主要有以下三个条件: 在多线程程序中  +  有共享数据   +  多条语句操作共享数据 多线程的场景和共享数据的套接是改变不了的 ...

  3. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  4. python 线程同步_Python 线程同步

    zhoushixiong Python 线程同步 以下代码可以直观展示加锁和不加锁时,对数据修改情况. 加锁时 # -*-* encoding:UTF-8 -*- # author : shoushi ...

  5. 线程同步与线程同步的必要性

    线程同步的必要性 所谓 线程同步(synchronization):指的就是在一个线程访问数据未结束时,其他线程不能对同一个数据进行访问. 如此,便可以保证对数据的访问是原子化的. 没有线程同步时,发 ...

  6. Linux线程的同步,linux线程同步

    我是linux和linux线程的新手.我花了一些时间谷歌搜索试图理解可用于线程同步的所有函数之间的差异.我还有一些问题. 我找到了所有这些不同类型的同步,每个同步都有许多锁定,解锁,测试锁等功能. & ...

  7. python中线程同步_Python线程同步在实际应用中功能体现

    在Python编程语言中,对于线程的操作是一个比较重要的应用技术.我们将会在这篇文章中为大家详细介绍一下这方面的相关基础内容,Python线程同步的应用方式.多个执行线程经常要共享数据,如果仅仅读取共 ...

  8. python 线程同步_python线程同步(2)

    Barrier 有人翻译成栅栏,建议使用屏障,可以想象成路障,道闸. 3.2引入python的新功能. Barrier(parties,action  = None,timeout = None):构 ...

  9. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

最新文章

  1. 显示一个顶层的提示信息
  2. (转) Twisted :第十八部分 Deferreds 全貌
  3. linux locate 用目录,Linux 命令(文件和目录管理 - locate)
  4. Java synchronized解析
  5. Android Studio修改debug.keystore
  6. IT外包 OpenEIM 强调CMMI等级
  7. CCF201509试题
  8. Cinema 4D R25 for mac三维动画设计
  9. Python 处理gbk编码文件
  10. 不小心把桌面进程结束了怎么办_点击任务管理器上的结束进程电脑桌面的图标都 – 手机爱问...
  11. 【stata】如何快速上手stata软件
  12. Android NFC识别CPU卡和m1卡
  13. NOVA温控器参数笔记(十)(故障代码)
  14. 用adb往手机上装软件
  15. 生鲜配送app开发方案
  16. html谷歌浏览器3D效果 图片不出现,chrome浏览器图片无法显示怎么办 chrome浏览器显示不出图片的解决方法...
  17. 浙大MBA考研经验分享:名校梦不可负~
  18. XP SP3 IIS 5.1版本安装包下载地址和XP SP3 IIS 5.1版本安装方法
  19. dumpsys activity 相关命令解析
  20. 一只小蜜蜂(简单递归)

热门文章

  1. 关于定时执行任务的解决方法,PendingIntent alarm braocastRecevier等等
  2. 第七个猴子java_黑猴子的家:Java SE 练习题第七章
  3. 用 UrlRewriteFilter 实现 URL 重写
  4. FTP两种工作模式:主动模式(Active FTP)和被动模式(Passive FTP)
  5. Maven2 的常用命令
  6. Index of Java
  7. 基础学习总结(五)---baseAdapter、ContentProvider
  8. Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
  9. 关闭 Windows Server 2008 用户权限控制(UAC)
  10. windows系统内实现端口转发