java 线程Thread 技术--1.5Lock 与condition 演示生产者与消费模式
在jdk 1.5 后,Java 引入了lock 锁来替代synchronized ,在使用中,lock锁的使用更加灵活,提供了灵活的 api ,不像传统的synchronized ,一旦进入synchronized中,方法是无法打断的,也就是说有时候会陷入漫长的等待当中;以及进行公平锁的创建(synchronized 说非公平的锁);
一,使用规范:
lock.lock();
try {
//doSomeThing
}
finally {
lock.unlock();
} 就相当于: synchronized mehod () { }
二,创建锁对象
ReentrantLock lock =new ReentrantLock();等价于 ReentrantLock lock =new ReentrantLock(false); 创建非公平锁 ReentrantLock lock =new ReentrantLock(true); 创建公平锁
三,公平锁与非公平锁的区别(以公平锁和非公平锁两种方式以多线程方式运行)
class ReenLock implements Runnable{
//创建公平锁
ReentrantLock lock =new ReentrantLock(true);
//创建非公平锁
//ReentrantLock lock =new ReentrantLock();
@Override
public void run() {
while(true) {
try {
lock.lock();
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"拿到了锁");
}
catch(Exception e) {
e.getStackTrace();
}
finally {
lock.unlock();
}
}
}
}
公平锁运行结果:
Thread-0拿到了锁
Thread-1拿到了锁
Thread-0拿到了锁
Thread-1拿到了锁
Thread-0拿到了锁
非公平锁运行结果:
Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁
Thread-0拿到了锁
结论:
1.公平锁保证了线程的运行顺序,按照先进线程的原则,每一次执行都要进行判断
2.非公平锁执行是无序的,但效率是最高了,synchronized 也是非公平锁,也是推荐使用的
四,tryLock() 使用;
trylock() :尝试去获得锁,返回boolean, ≈在指定的时间内,如果它没有被其他线程占有且没有被打断,则获得这把锁;
我们可以在没有获得这把锁的时候,去执行程序其他的逻辑;
class TryLock implements Runnable{
//创建非公平锁
ReentrantLock lock =new ReentrantLock();
@Override
public void run() {
boolean tryLock =false;
try {
//尝试获取锁,如果能得到锁,则立即返回true
tryLock=lock.tryLock(5, TimeUnit.SECONDS);
if(tryLock) {
Thread.sleep(10000);
System.out.println(Thread.currentThread().getName()+"拿到了锁");
}
else {
//没有拿到锁
System.out.println("号外:有个人长时间占这锁");
}
}
catch(Exception e) {
e.getStackTrace();
}
finally {
//必须进行判断,以防拿不到锁去释放会报错
if(tryLock) {lock.unlock();};
}
}
}
五, 要说lock 锁代替了synchronized ,那么condition 代替了object 中 wait notify notifyAll 等方法;
演示使用lock 和condition 进行生产者与消费者的演示
/**
* use jdk1.5 的reentranLock 与condition 进行provider and consumer
* lock 锁代替了synchronized
* @author iscys
*
*/
public class LockAndConditionProviderAndConsumer { public static void main(String[] args) { NewLock samp =new NewLock();
PrividerNewHandler provider =new PrividerNewHandler(samp);
ConsumerNewHandler consumer =new ConsumerNewHandler(samp); new Thread(provider).start();
new Thread(provider).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
} } class PrividerNewHandler implements Runnable{
private NewLock newl;
PrividerNewHandler(NewLock newl){
this.newl=newl;
}
@Override
public void run() { try {
while(true)
newl.provider();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } class ConsumerNewHandler implements Runnable{
private NewLock newl;
ConsumerNewHandler(NewLock newl){
this.newl=newl;
}
@Override
public void run() { try {
while(true)
newl.consumer();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } class NewLock{
private int max =10;
private int init=0;
ReentrantLock lock =new ReentrantLock();
Condition p =lock.newCondition();
Condition c=lock.newCondition();
void provider(){
lock.lock();
try {
while(init>=max) {
p.await();
}
Thread.sleep(100);
init++;
System.out.println(Thread.currentThread().getName()+"生产到了"+init);
c.signalAll();
}
catch(Exception e) {}
finally {lock.unlock();} } void consumer(){
lock.lock();
try {
while(init==0) {
c.await();
}
Thread.sleep(100);
init--; System.err.println(Thread.currentThread().getName()+"消费到了"+init);
p.signalAll();
}
catch(Exception e) {}
finally {lock.unlock();} }
}
java 线程Thread 技术--1.5Lock 与condition 演示生产者与消费模式的更多相关文章
- java 线程Thread 技术--线程状态与同步问题
线程技术第三篇: 线程的状态: 1. 创建状态: 当用new 操作符创建一个新的线程对象时,该线程就处于创建状态,系统不为它分配资源 2.可运行状态:当线程调用start 方法将为线程分配必须的系统资 ...
- java 线程Thread 技术--volatile关键字
java 语言中允许线程访问共享变量,为了保证共享变量能被准确和一致的更新,Java 语言提供了volatile 关键字,也就是我们所说的内存一致性: 问题抛出:(尝试去运行下面代码,以及将volat ...
- java 线程Thread 技术--1.5 Future与Callable
Callable: 从官方文档说起: 通过实现callable 的called 方法可以使一个任务可以返回一个结果以及可能抛出一个异常: callable 与runnable 是相似的,可以被其他线程 ...
- java 线程Thread 技术--1.5 Executor Executors,ThreadPool,Queue
Executors : Executors ,就是一个线程工具类:大部分操作线程的方法,都可以在这个工具类中就行创建,执行,调用一些线程的方法: Executor : 用于执行和提交一个runnabl ...
- java 线程Thread 技术--方法演示生产与消费模式
利用wait 与notifyAll 方法进行演示生产与消费的模式的演示,我们两个线程负责生产,两个线程消费,只有生产了才能消费: 在effective Java 中有说过: 1. 在Java 中 ,使 ...
- java 线程Thread 技术--线程创建源码解释
永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...
- java 线程Thread 技术--线程方法详解
Thread 类常用的方法与Object类提供的线程操作方法:(一个对象只有一把锁
- java 线程Thread 技术--创建线程的方式
在第一节中,对线程的创建我们通过看文档,得知线程的创建有两种方式进行实现,我们进行第一种方式的创建,通过继承Thread 类 ,并且重写它的run 方法,就可以进行线程的创建,所有的程序执行都放在了r ...
- java线程池技术(二): 核心ThreadPoolExecutor介绍
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程池技术属于比较"古老"而又比较基础的技术了,本篇博客主要作用是个人技术梳理,没什么新玩意. 一.Java线程池技术的 ...
随机推荐
- zookeeper和dubbo的关系
Dubbo建议使用Zookeeper作为服务的注册中心. 1. Zookeeper的作用: zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知 ...
- js总结001
JSTL 表达式与 EL 语言 http://leon906998248.iteye.com/blog/1502569 2 jquery中$each()方法的使用指南 http: ...
- React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: undefined.
昨天在项目中,重新封装组件时,引用了原来的一个子组件,但发现子组件在其他页面正常,在新的组件里面就发生保存, 然后把子组件注释,随便显示其div元素也正常,纠结了很久,最后发现引用的方式有问题 子组件 ...
- 译:SQL Server的Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息
注: 本文译自https://www.sqlskills.com/blogs/paul/missing-index-dmvs-bug-that-could-cost-your-sanity/ 原文作者 ...
- C# 图像处理: 获取当前活动窗口句柄,获取窗口大小及位置
需调用API函数 需在开头引入命名空间 using System.Runtime.InteropServices; 获取当前窗口句柄:GetForegroundWindow() [DllImport( ...
- 吴裕雄 24-MySQL 索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度.打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一 ...
- 1-keystone 部署
https://github.com/openstack/keystone 最新版为rocky 1. 进入mysql create database keystone; grant all privi ...
- vuex this.$store.state.属性和mapState的属性中的一点点区别
做泰康公众号的项目时候有一个需求创建公众号的时候后台有一个社区id提供给后台展现人员和部门,在群发消息时候也要给后台一个社区id只不过获取社区的id接口和上一个不是一样的,本来在页面中写了两个sele ...
- 关于H5唤醒APP的功能实现(千辛万苦啊!)
首先,我是个后端,写java的,甚至不是搞移动端的,所以js这方面有点底子但不专业,对于出现的错误也请见谅,原来项目要求有个H5页面打开APP的功能就强行要做,没办法就想办法搞一下,网上的教程基本都是 ...
- 03_java基础(九)之综合练习与考核评估
25.综合练习之车站业务分析 完成步骤: 需求: 以车站业务对车票做增删改查操作 1.建立数据库 2.建立车票表 3.建立java项目结构(model\dao\service\test) 4.创建mo ...