`

util.Concurrent-Lock&Condition处理线程访问共享资源的安全问题

    博客分类:
  • Java
 
阅读更多

 

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(2.2 /3.1)

    《backport-util-concurrent:Java并发编程的利器》 在Java的世界里,高效并发处理是提升应用程序性能的关键因素之一。backport-util-concurrent库,正如其名,是一种将Java 5及以上版本的并发特性“回移植”到Java...

    Java多线程 - (一) 最简单的线程安全问题

    线程安全问题通常涉及到多个线程对共享资源的访问,如果管理不当,可能会导致数据不一致、死锁等问题。 首先,我们需要了解什么是线程安全。一个方法或变量被称为线程安全,当它在多线程环境下被调用时,仍然能保证...

    java多线程编程总结

    - `java.util.concurrent.BlockingQueue`接口用于在线程间共享数据。 ##### 6. 条件变量 - `java.util.concurrent.locks.Condition`接口用于实现更复杂的同步机制。 ##### 7. 原子量 - `java.util.concurrent....

    java 资源搜索并下载(线程等待和通报)

    每个线程负责下载不同的资源,`java.util.concurrent`包提供了丰富的工具,如`ExecutorService`和`Future`,可以方便地管理线程池和控制并发执行。线程池可以避免频繁创建和销毁线程带来的开销。 四、线程等待和...

    JavaLock与Condition的理解Reentran

    总结来说,JavaLock与Condition提供了高级的并发控制手段,能够帮助开发者设计出更高效、更可控的多线程程序。通过ReentrantLock的灵活配置和Condition的精细调度,可以解决许多复杂的同步问题。在实际开发中,应...

    java多线程实现生产者和消费者

    在Java编程中,多线程是并发处理任务的关键机制,而生产者-消费者问题是多线程编程中的一个经典模型。这个模型描述了两个角色:生产者(Producer)负责创建资源,消费者(Consumer)则负责消耗这些资源。为了解决...

    生产者-消费者(lock和condition).zip

    在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...

    java线程安全总结.pdf

    在多线程环境下保证线程安全非常重要,因为不当的线程同步处理可能会导致数据竞争(race condition)、死锁(deadlock)、资源消耗、内存泄漏等问题。 要实现线程安全,通常会使用Java提供的几种同步机制: 1. ...

    juconcurrent:java.util.concurrent

    Java JUC的使用1.volatile关键字-内存可见性2....实现Callable接口6.Lock同步锁7.Condition控制线程通信8.线程按序交替9.ReadWriteLock读写锁10.线程八锁11.线程池12.线程调度13.ForkJoinPool 分支/合并框架 工作窃取

    java5 thread

    - `java.util.concurrent.locks`:提供了更灵活的锁定机制,包括`Lock`和`Condition`接口,支持更复杂的线程同步需求。 ### 2. Callable和Future接口 `Callable`接口类似于`Runnable`,但可以返回一个结果,并且...

    java-Thread-study-summary.zip_java 多线程

    - `Lock`和`Condition`:`java.util.concurrent.locks`包提供了更灵活的锁机制,如`ReentrantLock`,可以精确控制线程唤醒和等待。 4. **线程优先级** Java线程有10个优先级,`MIN_PRIORITY`(1),`NORM_...

    Java并发编程(20)并发新特性-Lock锁和条件变量(

    总之,Java并发新特性中的Lock锁和条件变量为开发者提供了更强大的工具来处理多线程同步问题。理解并熟练运用它们,可以编写出更加高效且易于维护的并发代码。在阅读提供的14页PDF文档时,应重点学习Lock的使用场景...

    Java并发编程-线程安全与基础构建模块

    首先,线程安全是并发编程中的核心概念,指的是多个线程访问同一资源时,无论执行顺序如何,都能保证程序的正确性。Java提供了多种手段来实现线程安全: 1. **同步机制**:包括`synchronized`关键字和`java.util....

    线程同步的一个小程序

    5. **读写锁(Read-Write Lock)**:读写锁允许多个读取线程同时访问资源,但写入操作是互斥的。在Java中,`java.util.concurrent.locks.ReadWriteLock`接口定义了读写锁,`ReentrantReadWriteLock`类实现了这一接口。...

    Java并发编程学习笔记.

    避免死锁需要合理设计线程间资源的获取顺序,使用`java.util.concurrent.locks.Condition`进行条件等待。 8. **线程池**:Java通过`ExecutorService`和`ThreadPoolExecutor`实现线程池,能够有效地管理和控制线程,...

    Java多线程与线程安全实践-基于Http协议的断点续传.rar

    线程安全意味着当多个线程访问共享数据时,程序的行为是正确和一致的。为了确保线程安全,Java提供了多种机制,包括: 1. **同步机制**:使用`synchronized`关键字可以确保同一时间只有一个线程可以执行特定代码块...

    Concurrency学习源码.zip

    7. **并发容器**:为支持并发访问,一些高级编程语言提供了线程安全的容器,如Java的`java.util.concurrent`包下的`ConcurrentHashMap`、`CopyOnWriteArrayList`等,C++的`std::mutex`保护的容器等。 8. **Future和...

    java线程学习

    - **条件变量(Condition)**:`java.util.concurrent.locks.Condition`接口,配合Lock实现复杂的线程通信。 5. **线程优先级** - Java线程有10个优先级,`Thread.MIN_PRIORITY`(1)到`Thread.MAX_PRIORITY`(10...

    线程之死锁处理方法代码.zip

    3. **死锁检测与恢复**:Java的`java.util.concurrent.locks.Condition`接口提供了一种检测死锁的方法。通过`ThreadMXBean`的`findDeadlockedThreads()`方法,可以检测到当前JVM中的死锁线程,并进行相应的恢复操作...

Global site tag (gtag.js) - Google Analytics