实现了lock的类为:ReentrantLock

接口的方式解释:

lock()方法为获取锁对象,如果未获取到锁就一直获取锁。

trylock():为布尔值,返回是否获取到了锁,如果没有获取到锁则返回false,如果获取到了则返回true

tryLock(long timeout, TimeUnit unit):表示在指定的时间内获取锁,如果未获取到,则返回false,否则返回true

unlock():为释放锁,使其他线程有机会执行。

lockInterruptibly():表示获取锁,如果线程被中断则抛出异常。

例如代码实例:

  1. package TestThread.ThreadLockDemo;
  2.  
  3. import java.util.concurrent.locks.ReentrantLock;
  4.  
  5. public class TestLock {
  6. public static void main(String[] args) {
  7. ReentrantLock lock = new ReentrantLock();// 初始化lock对象
  8. Test2 test2 = new Test2("苹果", 100);// 初始化苹果的数量
  9. Test1 test1 = new Test1(lock, 10, test2);// 初始化线程对象
  10. Thread t1 = new Thread(test1, "线程1");// 创建线程
  11. Thread t2 = new Thread(test1, "线程2");
  12. Thread t3 = new Thread(test1, "线程3");
  13. t1.start();// 启动线程
  14. t2.start();
  15. t3.start();
  16. }
  17. }
  18.  
  19. class Test1 implements Runnable {
  20. private int count;
  21. private ReentrantLock lock;
  22. private Test2 test2;
  23.  
  24. public Test1(ReentrantLock lock, int count, Test2 test2) {
  25. this.lock = lock;
  26. this.count = count;
  27. this.test2 = test2;
  28. }
  29.  
  30. @Override
  31. public void run() {
  32. lock.lock();// 枷锁
  33. try {
  34. test2.DiscountApple(count);
  35. } catch (Exception e) {
  36. System.out.print("调用卖苹果的方法发生异常!");
  37. } finally {
  38. lock.unlock();// 解锁
  39. }
  40. }
  41. }
  42.  
  43. class Test2 {
  44. private String name;
  45. int count;
  46.  
  47. /**
  48. * @param name苹果的名字
  49. * @param count初始化苹果的数量
  50. */
  51. public Test2(String name, int count) {
  52. this.name = name;
  53. this.count = count;
  54. }
  55.  
  56. /**
  57. * * @author 作者 E-mail:
  58. *
  59. * @date 创建时间:2017年3月24日 下午1:13:14
  60. * @version 1.0
  61. * @parameter
  62. * @since
  63. * @return
  64. */
  65. public void DiscountApple(int discount) {
  66. this.count = this.count - discount;
  67. System.out.println(Thread.currentThread().getName() + ":苹果的数量为:" + this.count + ",卖掉了" + discount);
  68. }
  69. }

实例结果:

trylock()方法的使用演示:

  1. package TestThread.ThreadLockDemo;
  2.  
  3. import java.util.concurrent.locks.ReentrantLock;
  4.  
  5. public class TestLock {
  6. public static void main(String[] args) {
  7. ReentrantLock lock = new ReentrantLock();// 初始化lock对象
  8. Test2 test2 = new Test2("苹果", 100);// 初始化苹果的数量
  9. Test1 test1 = new Test1(lock, 10, test2);// 初始化线程对象
  10. Thread t1 = new Thread(test1, "线程1");// 创建线程
  11. Thread t2 = new Thread(test1, "线程2");
  12. Thread t3 = new Thread(test1, "线程3");
  13. t1.start();// 启动线程
  14. t2.start();
  15. t3.start();
  16. }
  17. }
  18.  
  19. class Test1 implements Runnable {
  20. private int count;
  21. private ReentrantLock lock;
  22. private Test2 test2;
  23.  
  24. public Test1(ReentrantLock lock, int count, Test2 test2) {
  25. this.lock = lock;
  26. this.count = count;
  27. this.test2 = test2;
  28. }
  29.  
  30. @Override
  31. public void run() {
  32. if (lock.tryLock()) {
  33. // lock.lock();// 枷锁
  34. try {
  35. test2.DiscountApple(count);
  36. } catch (Exception e) {
  37. System.out.print("调用卖苹果的方法发生异常!");
  38. } finally {
  39. lock.unlock();// 解锁
  40. }
  41. } else {
  42. System.out.println(Thread.currentThread().getName() + "未获取到锁");
  43. }
  44. }
  45. }
  46.  
  47. class Test2 {
  48. private String name;
  49. int count;
  50.  
  51. /**
  52. * @param name苹果的名字
  53. * @param count初始化苹果的数量
  54. */
  55. public Test2(String name, int count) {
  56. this.name = name;
  57. this.count = count;
  58. }
  59.  
  60. /**
  61. * * @author 作者 E-mail:
  62. *
  63. * @date 创建时间:2017年3月24日 下午1:13:14
  64. * @version 1.0
  65. * @parameter
  66. * @since
  67. * @return
  68. */
  69. public void DiscountApple(int discount) {
  70. this.count = this.count - discount;
  71. System.out.println(Thread.currentThread().getName() + ":苹果的数量为:" + this.count + ",卖掉了" + discount);
  72. }
  73. }

测试结果为:

unlock()

java中的 java.util.concurrent.locks.ReentrantLock类的使用方式的更多相关文章

  1. java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍

    在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...

  2. java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解

    看API文档介绍几个方法:  JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock                    2.接口Conditio ...

  3. 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock

    JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...

  4. Synchronized和java.util.concurrent.locks.Lockde区别联系

    1.Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用 ...

  5. 简述synchronized和java.util.concurrent.locks.Lock的异同?

    主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ...

  6. 简述synchronized和java.util.concurrent.locks.Lock异同

    主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ...

  7. Java并发—java.util.concurrent.locks包

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当 ...

  8. synchronized 和 java.util.concurrent.locks.Lock 的异同 ?

    主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...

  9. 013-并发编程-java.util.concurrent.locks之-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放

    一.概述 AbstractQueuedSynchronizer (简称AQS),位于java.util.concurrent.locks.AbstractQueuedSynchronizer包下, A ...

随机推荐

  1. GDI+ 或 GdiPlus 在VC6下的使用方法

    1.在你的app类头文件中假如以下代码(红字显示) #if !defined(AFX_WALKLTDEMO_H__826A807C_C01D_4FF0_9248_A6BD0369F3A8__INCLU ...

  2. python_练习04

    选课系统 角色:学校.学员.课程.讲师 要求: 1.创建北京.上海2所学校 2.创建linux.python.go3个课程,linux.python在北京开,go在上海开3.课程包含,周期,价格,通过 ...

  3. 根据设备width(375)动态设置font-size

    根据html的font-size使用rem来优化移动端页面 (function () { var w = window, d = document.documentElement, t; var re ...

  4. [转]NSIS 制作安装包无法创建桌面快捷方式或无法删除开始菜单项

    用户将桌面文件转移了,如: D:\Doc\Desktop  ,安装程序后,桌面不会生成快捷方式, 或者卸载后,开始菜单中的文件也不会被删除 NSIS卸载后无法删除开始菜单中的内容原因:因为NSIS中使 ...

  5. [GNU] 喝一杯咖啡, 写一写 Makefile

    Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...

  6. python 命令行颜色

    #coding=utf-8 import ctypes,sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -1 ...

  7. 【C++】C++中的string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  8. python入门(十一):异常

     1.异常概念: >>> a Traceback (most recent call last): File "<stdin>", line 1, i ...

  9. react 关闭eslint 配置

    在 package.json 中修改为一下 "eslintConfig": { "extends": "react-app", " ...

  10. jquery cdn bootstrap静态资源库问题

    使用微软静态资源库 <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.min.js">&l ...