java中的 java.util.concurrent.locks.ReentrantLock类的使用方式
实现了lock的类为:ReentrantLock
接口的方式解释:
lock()方法为获取锁对象,如果未获取到锁就一直获取锁。
trylock():为布尔值,返回是否获取到了锁,如果没有获取到锁则返回false,如果获取到了则返回true
tryLock(long timeout, TimeUnit unit):表示在指定的时间内获取锁,如果未获取到,则返回false,否则返回true
unlock():为释放锁,使其他线程有机会执行。
lockInterruptibly():表示获取锁,如果线程被中断则抛出异常。
例如代码实例:
- package TestThread.ThreadLockDemo;
- import java.util.concurrent.locks.ReentrantLock;
- public class TestLock {
- public static void main(String[] args) {
- ReentrantLock lock = new ReentrantLock();// 初始化lock对象
- Test2 test2 = new Test2("苹果", 100);// 初始化苹果的数量
- Test1 test1 = new Test1(lock, 10, test2);// 初始化线程对象
- Thread t1 = new Thread(test1, "线程1");// 创建线程
- Thread t2 = new Thread(test1, "线程2");
- Thread t3 = new Thread(test1, "线程3");
- t1.start();// 启动线程
- t2.start();
- t3.start();
- }
- }
- class Test1 implements Runnable {
- private int count;
- private ReentrantLock lock;
- private Test2 test2;
- public Test1(ReentrantLock lock, int count, Test2 test2) {
- this.lock = lock;
- this.count = count;
- this.test2 = test2;
- }
- @Override
- public void run() {
- lock.lock();// 枷锁
- try {
- test2.DiscountApple(count);
- } catch (Exception e) {
- System.out.print("调用卖苹果的方法发生异常!");
- } finally {
- lock.unlock();// 解锁
- }
- }
- }
- class Test2 {
- private String name;
- int count;
- /**
- * @param name苹果的名字
- * @param count初始化苹果的数量
- */
- public Test2(String name, int count) {
- this.name = name;
- this.count = count;
- }
- /**
- * * @author 作者 E-mail:
- *
- * @date 创建时间:2017年3月24日 下午1:13:14
- * @version 1.0
- * @parameter
- * @since
- * @return
- */
- public void DiscountApple(int discount) {
- this.count = this.count - discount;
- System.out.println(Thread.currentThread().getName() + ":苹果的数量为:" + this.count + ",卖掉了" + discount);
- }
- }
实例结果:
trylock()方法的使用演示:
- package TestThread.ThreadLockDemo;
- import java.util.concurrent.locks.ReentrantLock;
- public class TestLock {
- public static void main(String[] args) {
- ReentrantLock lock = new ReentrantLock();// 初始化lock对象
- Test2 test2 = new Test2("苹果", 100);// 初始化苹果的数量
- Test1 test1 = new Test1(lock, 10, test2);// 初始化线程对象
- Thread t1 = new Thread(test1, "线程1");// 创建线程
- Thread t2 = new Thread(test1, "线程2");
- Thread t3 = new Thread(test1, "线程3");
- t1.start();// 启动线程
- t2.start();
- t3.start();
- }
- }
- class Test1 implements Runnable {
- private int count;
- private ReentrantLock lock;
- private Test2 test2;
- public Test1(ReentrantLock lock, int count, Test2 test2) {
- this.lock = lock;
- this.count = count;
- this.test2 = test2;
- }
- @Override
- public void run() {
- if (lock.tryLock()) {
- // lock.lock();// 枷锁
- try {
- test2.DiscountApple(count);
- } catch (Exception e) {
- System.out.print("调用卖苹果的方法发生异常!");
- } finally {
- lock.unlock();// 解锁
- }
- } else {
- System.out.println(Thread.currentThread().getName() + "未获取到锁");
- }
- }
- }
- class Test2 {
- private String name;
- int count;
- /**
- * @param name苹果的名字
- * @param count初始化苹果的数量
- */
- public Test2(String name, int count) {
- this.name = name;
- this.count = count;
- }
- /**
- * * @author 作者 E-mail:
- *
- * @date 创建时间:2017年3月24日 下午1:13:14
- * @version 1.0
- * @parameter
- * @since
- * @return
- */
- public void DiscountApple(int discount) {
- this.count = this.count - discount;
- System.out.println(Thread.currentThread().getName() + ":苹果的数量为:" + this.count + ",卖掉了" + discount);
- }
- }
测试结果为:
unlock() |
java中的 java.util.concurrent.locks.ReentrantLock类的使用方式的更多相关文章
- java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍
在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...
- java基础知识回顾之java Thread类学习(八)--java.util.concurrent.locks(JDK1.5)与synchronized异同讲解
看API文档介绍几个方法: JDK1.5中提供了多线程的升级解决方案: 特点: 1.将同步synchronized显示的替换成Lock 2.接口Conditio ...
- 12、java5锁java.util.concurrent.locks.Lock之ReentrantLock
JDK文档描述: public interface LockLock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实现允许更灵活的结构,可以具有差别很大的属性,可 ...
- Synchronized和java.util.concurrent.locks.Lockde区别联系
1.Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用 ...
- 简述synchronized和java.util.concurrent.locks.Lock的异同?
主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ...
- 简述synchronized和java.util.concurrent.locks.Lock异同
主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ...
- Java并发—java.util.concurrent.locks包
一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当 ...
- synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...
- 013-并发编程-java.util.concurrent.locks之-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放
一.概述 AbstractQueuedSynchronizer (简称AQS),位于java.util.concurrent.locks.AbstractQueuedSynchronizer包下, A ...
随机推荐
- GDI+ 或 GdiPlus 在VC6下的使用方法
1.在你的app类头文件中假如以下代码(红字显示) #if !defined(AFX_WALKLTDEMO_H__826A807C_C01D_4FF0_9248_A6BD0369F3A8__INCLU ...
- python_练习04
选课系统 角色:学校.学员.课程.讲师 要求: 1.创建北京.上海2所学校 2.创建linux.python.go3个课程,linux.python在北京开,go在上海开3.课程包含,周期,价格,通过 ...
- 根据设备width(375)动态设置font-size
根据html的font-size使用rem来优化移动端页面 (function () { var w = window, d = document.documentElement, t; var re ...
- [转]NSIS 制作安装包无法创建桌面快捷方式或无法删除开始菜单项
用户将桌面文件转移了,如: D:\Doc\Desktop ,安装程序后,桌面不会生成快捷方式, 或者卸载后,开始菜单中的文件也不会被删除 NSIS卸载后无法删除开始菜单中的内容原因:因为NSIS中使 ...
- [GNU] 喝一杯咖啡, 写一写 Makefile
Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...
- python 命令行颜色
#coding=utf-8 import ctypes,sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -1 ...
- 【C++】C++中的string类的用法总结
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...
- python入门(十一):异常
1.异常概念: >>> a Traceback (most recent call last): File "<stdin>", line 1, i ...
- react 关闭eslint 配置
在 package.json 中修改为一下 "eslintConfig": { "extends": "react-app", " ...
- jquery cdn bootstrap静态资源库问题
使用微软静态资源库 <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.min.js">&l ...