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(); } } } }
相关推荐
《backport-util-concurrent:Java并发编程的利器》 在Java的世界里,高效并发处理是提升应用程序性能的关键因素之一。backport-util-concurrent库,正如其名,是一种将Java 5及以上版本的并发特性“回移植”到Java...
线程安全问题通常涉及到多个线程对共享资源的访问,如果管理不当,可能会导致数据不一致、死锁等问题。 首先,我们需要了解什么是线程安全。一个方法或变量被称为线程安全,当它在多线程环境下被调用时,仍然能保证...
- `java.util.concurrent.BlockingQueue`接口用于在线程间共享数据。 ##### 6. 条件变量 - `java.util.concurrent.locks.Condition`接口用于实现更复杂的同步机制。 ##### 7. 原子量 - `java.util.concurrent....
每个线程负责下载不同的资源,`java.util.concurrent`包提供了丰富的工具,如`ExecutorService`和`Future`,可以方便地管理线程池和控制并发执行。线程池可以避免频繁创建和销毁线程带来的开销。 四、线程等待和...
总结来说,JavaLock与Condition提供了高级的并发控制手段,能够帮助开发者设计出更高效、更可控的多线程程序。通过ReentrantLock的灵活配置和Condition的精细调度,可以解决许多复杂的同步问题。在实际开发中,应...
在Java编程中,多线程是并发处理任务的关键机制,而生产者-消费者问题是多线程编程中的一个经典模型。这个模型描述了两个角色:生产者(Producer)负责创建资源,消费者(Consumer)则负责消耗这些资源。为了解决...
在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...
在多线程环境下保证线程安全非常重要,因为不当的线程同步处理可能会导致数据竞争(race condition)、死锁(deadlock)、资源消耗、内存泄漏等问题。 要实现线程安全,通常会使用Java提供的几种同步机制: 1. ...
Java JUC的使用1.volatile关键字-内存可见性2....实现Callable接口6.Lock同步锁7.Condition控制线程通信8.线程按序交替9.ReadWriteLock读写锁10.线程八锁11.线程池12.线程调度13.ForkJoinPool 分支/合并框架 工作窃取
- `java.util.concurrent.locks`:提供了更灵活的锁定机制,包括`Lock`和`Condition`接口,支持更复杂的线程同步需求。 ### 2. Callable和Future接口 `Callable`接口类似于`Runnable`,但可以返回一个结果,并且...
- `Lock`和`Condition`:`java.util.concurrent.locks`包提供了更灵活的锁机制,如`ReentrantLock`,可以精确控制线程唤醒和等待。 4. **线程优先级** Java线程有10个优先级,`MIN_PRIORITY`(1),`NORM_...
总之,Java并发新特性中的Lock锁和条件变量为开发者提供了更强大的工具来处理多线程同步问题。理解并熟练运用它们,可以编写出更加高效且易于维护的并发代码。在阅读提供的14页PDF文档时,应重点学习Lock的使用场景...
首先,线程安全是并发编程中的核心概念,指的是多个线程访问同一资源时,无论执行顺序如何,都能保证程序的正确性。Java提供了多种手段来实现线程安全: 1. **同步机制**:包括`synchronized`关键字和`java.util....
5. **读写锁(Read-Write Lock)**:读写锁允许多个读取线程同时访问资源,但写入操作是互斥的。在Java中,`java.util.concurrent.locks.ReadWriteLock`接口定义了读写锁,`ReentrantReadWriteLock`类实现了这一接口。...
避免死锁需要合理设计线程间资源的获取顺序,使用`java.util.concurrent.locks.Condition`进行条件等待。 8. **线程池**:Java通过`ExecutorService`和`ThreadPoolExecutor`实现线程池,能够有效地管理和控制线程,...
线程安全意味着当多个线程访问共享数据时,程序的行为是正确和一致的。为了确保线程安全,Java提供了多种机制,包括: 1. **同步机制**:使用`synchronized`关键字可以确保同一时间只有一个线程可以执行特定代码块...
7. **并发容器**:为支持并发访问,一些高级编程语言提供了线程安全的容器,如Java的`java.util.concurrent`包下的`ConcurrentHashMap`、`CopyOnWriteArrayList`等,C++的`std::mutex`保护的容器等。 8. **Future和...
- **条件变量(Condition)**:`java.util.concurrent.locks.Condition`接口,配合Lock实现复杂的线程通信。 5. **线程优先级** - Java线程有10个优先级,`Thread.MIN_PRIORITY`(1)到`Thread.MAX_PRIORITY`(10...
3. **死锁检测与恢复**:Java的`java.util.concurrent.locks.Condition`接口提供了一种检测死锁的方法。通过`ThreadMXBean`的`findDeadlockedThreads()`方法,可以检测到当前JVM中的死锁线程,并进行相应的恢复操作...