Java5对共享资源访问的解决方案:
1个锁上绑定多个监视器
package thread.lock; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 使用Java5新的共享资源处理方式 * Lock * Condition * * 最大的不同:1个锁上可以绑定多个监视器! * 让线程的等待与唤醒更明确 */ public class TwoThreadsCommunication { public static void main(String[] args) { new TwoThreadsCommunication().justDoIt(); } public void justDoIt() { final ResourceHandler r = new ResourceHandler(); new Thread(new Runnable() { public void run() { for(int i=0;i<100;i++) r.produce(); } }, "线程A").start(); new Thread(new Runnable() { public void run() { for(int i=0;i<100;i++) r.consume(); } }, "线程B").start(); } /** * 资源类 * 使用Java5新增的处理资源共享的锁机制 */ class ResourceHandler { //synchronized -> lock //wait() -> await(), notify() -> signal(), notifyAll() -> signalAll() final Lock lock = new ReentrantLock();//唯一锁 //创建与lock绑定的不同Condition final Condition con_produce = lock.newCondition();//生产者在lock锁上的监视器 final Condition con_consume = lock.newCondition();//消费者在lock锁上的监视器 //状态变量在资源内部进行操作 private boolean full; //生产线程操作共享资源的方法 public void produce() { //加锁 lock.lock(); try { //notice: 这里用while,不要用if。可防止死锁! while(full) { try { con_produce.await();/**生产者等待*/ } catch (InterruptedException e) { e.printStackTrace(); } } for(int i=1;i<=10;i++) { System.out.println(Thread.currentThread().getName()+" run***" + i); } full = true; con_consume.signal();/**唤醒消费者*/ } finally { //释放锁 lock.unlock(); } } //消费线程操作共享资源的方法 public void consume() { //加锁 lock.lock(); try { //notice: 这里用while,不要用if。可防止死锁! while(!full) { try { con_consume.await();/**消费者等待*/ } catch (InterruptedException e) { e.printStackTrace(); } } for(int j=1;j<=10;j++) { System.out.println(Thread.currentThread().getName()+" run******" + j); } full = false; con_produce.signal();/**唤醒生产者*/ } finally { lock.unlock(); } } } }
相关推荐
java.util.concurrent-多线程框架
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
标签:atlassian-util-concurrent-0.0.12.jar.zip,atlassian,util,concurrent,0.0.12,jar.zip包下载,依赖包
backport-util-concurrent-3.1.jar 和 geronimo-stax-api_1.0_spec-1.0.1.jar 复制到 MyEclipse 6.5\eclipse\plugins\Axis2_Codegen_Wizard_1.3.0\lib 文件夹下。 (3).注册此 jar 包: 修改MyEclipse 6.5\eclipse...
backport-util-concurrent.jarbackport-util-concurrent.jarbackport-util-concurrent.jar
正在处理依赖关系 apr-util,它被软件包 greenplum-db-6.0.0_beta.7-1.el7.x86_64 需要 --> 正在处理依赖关系 apr,它被软件包 greenplum-db-6.0.0_beta.7-1.el7.x86_64 需要 --> 正在检查事务 ---> ...
- copy %AXIS2_HOME%\lib\backport-util-concurrent-3.1.jar 到%ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\lib - 注册此 jar 包: 編輯 %ECLIPSE_HOME%\plugins\Axis2_Codegen_Wizard_1.3.0\plugin.xml , ...
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
java并发工具包 java.util.concurrent中文版-带书签版
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1)
在Eclipse3.5用Axis2中创建wsdl文件时,在最后一步出现如下错误: An error ocCurred while ...解决用到的jar包,两个jar包在backport-util-concurrent-3.1.jar和geronimo-stax-api_1.0_spec-1.0.1.jar.zip的压缩文件中
jar包,官方版本,自测可用
如果不能免费下载,关注我,评论区联系我索要!
本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下
java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和...
asm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util-3.2.jarasm-util...
backport-util-concurrent-1.0.jar,