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 ...
随机推荐
- MySQL(基础技能)
一.概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Serve ...
- java异常——五个关键字(try、catch、finally、throw、throws)
一.try.catch.finally常用组合 try{ xxx }catch(xxxException e){ e.printStackTrace(); } try{ xxx }catch(xxxE ...
- drf框架之跨域问题的解决与缓存问题
什么是跨域问题呢: 1. 跨域问题: CORS 跨域资源共享: 有简单请求 和非简单请求 简单请求: 只要符合如下两条,就是简单请求,否则则是非简单请求 (1) 请求方法是以下三种方法之一: HEAD ...
- Python 中文数字转阿拉伯数字
#只能转数字,传参中包含非数字会错. def t(str): zhong={'零':0,'一':1,'二':2,'三':3,'四':4,'五':5,'六':6,'七':7,'八':8,'九':9}; ...
- 关于VMware虚拟机安装镜像时黑屏的解决办法
新下载的VMware14,设置了新的虚拟机,镜像放的是ubuntu系统,然后开机要安装系统的时候黑屏,并没有进入到安装系统的界面 解决办法:在管理员权限下打开cmd,然后运行netsh winsock ...
- webservice 教程
https://ke.qq.com/webcourse/index.html#cid=28875&term_id=100182700&taid=800324205965515& ...
- PostgreSQL在windows 10上的下载和安装
一.下载 PostgreSQL Windows版本下载地址: https://www.postgresql.org/download/windows/ 下载地址包含2个版本,根据个人喜好下载即可: 1 ...
- 1804.03235-Large scale distributed neural network training through online distillation.md
现有分布式模型训练的模式 分布式SGD 并行SGD: 大规模训练中,一次的最长时间取决于最慢的机器 异步SGD: 不同步的数据,有可能导致权重更新向着未知方向 并行多模型 :多个集群训练不同的模型,再 ...
- k8s 代码生成
https://blog.openshift.com/kubernetes-deep-dive-code-generation-customresources/ # 代码生成的工作目录,也就是我们的项 ...
- EOSIO/appbase
[EOSIO/appbase] AppBase是EOSIO开源一个plugins架构程序框架,被应用于 EOS nodeos中.AppBase manages the plugin life-cycl ...