- 浏览: 72704 次
文章分类
最新评论
主要相同点:Lock能完成synchronized所实现的所有功能,同时 lock性能上高于synchronized
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
另外,Synchronized---对象加锁,Lock---基于栈中的框架,而不是具体的某个对象,只需要在栈里设置锁的开始和结束就行,不用关心大小对象的变化...、
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
另外,Synchronized---对象加锁,Lock---基于栈中的框架,而不是具体的某个对象,只需要在栈里设置锁的开始和结束就行,不用关心大小对象的变化...、
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestThread{ private final static Lock lock = new ReentrantLock(); private final static Condition produced = lock.newCondition(); private final Condition consumed = lock.newCondition(); boolean available = false; static int k=100; public static void main(String[] args){ /*lock.lock(); try{ for(int i=3;i>0;i--){ System.out.println("------"+i+"-----"); produced.await(3,TimeUnit.SECONDS); } } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); }*/ final TestThread t = new TestThread(); Thread proTh = new Thread(){ public void run(){ try { t.produce(); } catch (InterruptedException e) { e.printStackTrace(); } } }; Thread cusTh = new Thread(){ public void run(){ try { t.consume(); } catch (InterruptedException e) { e.printStackTrace(); } } }; ExecutorService service = Executors.newCachedThreadPool(); service.submit(cusTh); for(int i=3;i>0;i--){ service.submit(proTh); } service.shutdown(); } /** * 生产者 * @throws InterruptedException */ public void produce() throws InterruptedException { lock.lock(); try { /*if(available){ // produced.await(); //放弃lock进入睡眠 System.out.println("-------------"); consumed.signal(); produced.await(); }*/ System.out.println("-----start------"); //consumed.signal(); // produced.await(10,TimeUnit.SECONDS); Thread.sleep(1000); //consumed.signal(); //发信号唤醒等待这个condition的线程 /*生产苹果*/ System.out.println("apple produced."); available = true; System.out.println("produce----->k="+k); k--; } finally { lock.unlock(); } } /** * 消费者 * @throws InterruptedException */ public synchronized void consume() throws InterruptedException { //lock.lock(); // try { /* if(!available){ System.out.println("1111111111"); produced.signal(); consumed.await();//放弃lock进入睡眠 //Thread.sleep(1000); }*/ // consumed.await(5,TimeUnit.SECONDS); Thread.sleep(5000); /*吃苹果*/ System.out.println("apple consumed."); available = false; //produced.signal();//发信号唤醒等待这个condition的线程 System.out.println("consume----->k="+k); k--; /* } finally { lock.unlock(); }*/ } }
发表评论
-
java调用js中写入的方法
2017-08-08 14:52 386ScriptEngineManager manager = n ... -
遍历object对象
2012-11-28 09:24 804如 {'name':'李大牛','age':'24'} 生 ... -
日期的使用
2012-11-23 18:23 6921.Calendar和date的转换 ca.setTime(d ... -
根据日期判断出星期
2012-11-14 16:48 627function getWeekString(date){ ... -
js Date转换成String
2012-09-28 11:25 1156Date.prototype.format = functio ... -
MessageFormat
2012-09-04 18:27 654MessageFormat用来格式化一个消息,通常是一个字符串 ... -
switch的参数类型
2012-08-20 14:56 918引用switch(expr1)中,expr1是一个整数表达式, ... -
String倒转
2012-08-20 10:54 765把string转换成byte数组,再按照一定的规则编译这个数组 ... -
String
2012-06-29 17:42 739String类是final的,不可被继承。public fin ... -
多线程示例
2012-06-14 12:23 722public class Test implements Ru ... -
List set和map
2012-06-06 11:10 775Collection ├List │├Linked ... -
数组和集合
2012-06-05 18:51 6551.数组和集合的定义 AType[ ] a=new ATy ... -
java线程
2012-05-15 18:27 6451.线程的定义 a.扩展java.lang.Thread类 ... -
操作xml文件
2012-05-03 13:48 7271. 介绍 1)DOM(JAXP Crimson解析 ... -
IO流的基本概念
2012-04-26 17:52 7481.基类 InputStream,OutputStream.都 ... -
文件的复制和删除
2012-04-26 17:37 658/** * 删除文件,通过文件的类型 * ...
相关推荐
通过java语言编写的生产者消费者,实现方法为lock类和condition类的配合完成。
JavaLock与Condition的理解ReentrantLock锁的简单使用技巧共5页.pdf.zip
6.4 使用Lock和Condition 6.5 使用volatile关键字 7. 线程通信: 7.1 使用wait()和notify()方法 7.2 使用Lock和Condition 8. 线程池: 8.1 线程池的概述 8.2 使用Executor框架创建线程池 8.3 线程池的优势和适用场景...
在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。 Lock类是Java类来提供的功能,丰富的api使得Lock类的同步功能比synchronized的同步更强大。本文章的所有...
多线程编程的核心思想 多线程编程的核心思想是指在多线程环境下如何实现线程安全、...多线程编程的核心思想是通过 Lock 和 Condition 接口来实现线程安全和同步机制,并使用 AQS 底层实现来实现锁和 Condition 接口。
C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装。不过里面也有很多细节值得学习。 std::mutex 先来看下std::mutex: 包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛...
主要介绍了Lock、Condition实现简单的生产者消费者模式示例,需要的朋友可以参考下
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
详细介绍了线程同步条件变量condition_variable的使用和它的源码,涉及到unique_lock, mutex, lock_guard, 虚假唤醒和惊群效应。
Condition 的使用 (划重点) Semaphore 的使用 ReadWriteLock 的使用 (划重点) StampedLock 的使用 CountDownLatch 和 CyclicBarrier 的使用 线程池的使用 (划重点) Future 和 FutureTask 的使用 CompletableFuture ...
比较实用,是操作系统很好的教辅资料。很详细的讲解。
此外,Lock接口还有一个带条件的锁——Condition接口的实现类ReentrantLock。这种带条件的锁使得线程可以在一定条件下挂起等待,直到其它线程唤醒它。 在实际使用场景中,例如多个用户同时操作一个银行账户的情况,...
主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下
Condition 条件变量: 介绍 Lock 接口中的 Condition,它可以实现更复杂的线程等待和通知机制。解释如何使用 await、signal 和 signalAll 方法。 通过这份资源,您将获得关于 Locks 框架中 Lock 接口的深入理解,从...
多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: – wait:线程挂起,收到notify通知后继续运行 – notify:通知其他线程, 解除其它线程的wai状态 – ...
4.线程间通信:lock、condition、wait、notify、notifyAll 5.Lock-free:atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList 6.关于锁的经验介绍 7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:...
Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。 使用Condition的主要方式为:线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件...
4、线程间的协调手段:lock、condition、wait、notify、notifyAll ☆ ☆ ☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList ☆ ☆ ☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...
Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用 ...需要特别指出的是,单个 Lock 可能与多个 Condition 对象关联。为了避免兼容性问题,Condition 方法的名称与对应的 Object 版本中的不同。