同步代码与同步代码块可以实现多线程的同步,JAVA并发框架提供另外了一个框架,它也能实现多线程的同步,即是Lock和Condition,Condition和Lock是配合在一起使用,从字面意思上看,Condition是条件锁,有了锁,为什么要引用条件锁呢?原因有两个:
1.对一个共享资源有读和写的能力,如果读线程或写线程获取了Lock的权力,即有能力进入,但是如果里面没有内容,读也没有用,如果空间已满了,写也写不了,所有还得有条件去判断一下,是不是线程要等待了;
2.提供一种多线程之间的通信机制,类似wait()和nofity()的原理。
看一个例子,就会明白了,还是实现上次的那个生产者和消费者的例子。
我们假设有一个篮子,最多可以放3个苹果,有多个人可以放苹果,也有多个人可以拿走苹果。
public class Apple {
private String appName ;
public Apple(String appName ){
this.appName =appName ;
}
public String ToString(){
return this .appName ;
}
}
public class Bascket {
List<Apple> bascket= new ArrayList<Apple>(10);
Lock lock = new ReentrantLock();
//条件锁与Lock是相关的
Condition noEmptity =lock .newCondition();
Condition isFull = lock.newCondition();
public void put(Apple app) throws InterruptedException{
//获取锁
lock.lock();
try{
if(bascket .size()>=10){
//等待
isFull.await();
}
bascket.add( app);
//唤醒其它等待线程
noEmptity.signalAll();
}
finally{
lock.unlock();
}
}
public Apple take() throws InterruptedException{
lock.lock();
Apple apple;
try{
if(bascket .size()<=0){
noEmptity.await();
}
apple= bascket.remove(0);
isFull.signalAll();
}
finally{
lock.unlock();
}
return apple ;
}
}
//生产者
public class Producer implements Runnable{
private Bascket bascket ;
private String name ;
public Producer(Bascket bascket ,String name ){
this.bascket =bascket ;
this.name =name ;
}
public void run(){
while(true ){
try {
System. out.println( name+ "produce..");
bascket.put( new Apple("name"+(int )Math.random()*1000));
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Thread. sleep(1000);
} catch (InterruptedException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class TestDemo {
public static void main(String args[]){
Bascket bascket= new Bascket();
Consumer c1= new Consumer(bascket ,"c1" );
Producer p1= new Producer(bascket ,"p1" );
Producer p2= new Producer(bascket ,"p2" );
//线程池管理
ExecutorService service = Executors. newCachedThreadPool();
service.execute( c1);
service.execute( p1);
service.execute( p2);
}
}
具体Lock的实现机制将会在源代码中加以分析。
分享到:
相关推荐
#### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念...
3. **锁**:Java并发库中的`java.util.concurrent.locks`包提供了更高级的锁机制,如可重入锁(`ReentrantLock`)、读写锁(`ReadWriteLock`)和条件变量(`Condition`),这些工具允许更灵活的控制并发访问。 4. **并发...
Java并发编程是Java语言中最为复杂且重要的部分之一,它涉及了多线程编程、内存模型、同步机制等多个领域。为了深入理解Java并发编程,有必要了解其核心技术点和相关实现原理,以下将详细介绍文件中提及的关键知识点...
《Java并发编程 设计原则与模式 第二版》是一本深受程序员喜爱的经典书籍,由Addison Wesley出版。这本书深入探讨了Java平台上的多线程编程技术,为开发者提供了丰富的设计原则和模式,帮助他们理解和解决并发环境中...
4. **锁与并发工具类**:介绍了Java.util.concurrent包中的锁机制,如ReentrantLock、读写锁(ReentrantReadWriteLock)、Condition接口,以及Semaphore、CountDownLatch、CyclicBarrier等并发工具类的使用场景和...
最后,书中将介绍一些高级话题,如原子类(Atomic Variables)、并发工具类(如CountDownLatch、CyclicBarrier、Semaphore等),以及Java并发框架如Fork/Join框架和CompletableFuture,这些高级特性能够帮助开发者...
6. **线程池**:Executor框架是Java并发编程的重要组成部分,它通过线程池管理线程,提高了系统资源的利用率,减少了线程创建和销毁的开销。 7. **并发异常处理**:书中强调了在并发环境中正确处理异常的重要性,...
《Java并发编程实战》这本书是Java开发者深入理解并发编程的重要参考书籍。本书旨在帮助程序员解决在多线程环境中遇到的实际问题,提升系统性能并保证其稳定性。随书源码提供了丰富的示例,让读者能够动手实践,加深...
《实战Java高并发程序设计》是一本专注于Java并发编程的经典文献,它深入浅出地讲解了如何在Java环境中处理高并发场景。这本书是PDF格式,包含详细的目录,方便读者快速定位到所需的知识点,是Java开发者提升并发...
6. **线程池**:Executor框架是Java并发编程的重要组成部分,通过ThreadPoolExecutor可以创建线程池,有效管理和控制并发线程的数量,避免过度创建和销毁线程带来的性能开销。 7. **死锁、活锁与饥饿**:并发编程中...
介绍Java并发编程中常用的集合框架,如ConcurrentHashMap、CopyOnWriteArrayList等,它们是如何在多线程环境下保证数据一致性与高效性的。 第五章:线程池 分析ExecutorService和ThreadPoolExecutor,解释如何配置...
- **JDK 7及更高版本的新特性**:例如Fork/Join框架、Parallel Streams等,这些都是Java并发编程的最新进展。 随书附带的`concurrentbook`和`concurrentbook-jdk7`文件夹可能包含了与上述知识点对应的示例代码,...
- **Lock接口**:介绍ReentrantLock、Condition、读写锁等高级同步工具,及其与synchronized的区别。 3. **并发集合** - **线程安全的集合**:如Vector、Collections.synchronizedXXX方法生成的同步集合,以及...
`Executor`框架是Java并发编程的核心,它提供了线程池的创建与管理。通过`ExecutorService`接口,我们可以提交任务(Runnable或Callable)并控制线程的执行。线程池可以有效控制运行的线程数量,避免了大量的线程...
Java并发工具包J.U.C(Java Util Concurrency)包含了丰富的一系列并发组件,如Lock框架(ReentrantLock等)、并发集合(ConcurrentHashMap等)、原子类(AtomicInteger等)、线程池(ExecutorService)和工具类。...
5. **线程池**:Executor框架是Java并发编程的核心部分,它引入了线程池的概念,可以有效地管理和控制线程的生命周期,避免频繁创建和销毁线程的开销。ThreadPoolExecutor是线程池的主要实现,通过调整核心线程数、...
这个"实战java高并发程序设计"的源码下载提供了深入理解和实践Java并发编程的机会。下面,我们将深入探讨Java并发相关的知识体系。 一、并发基础 并发是指多个任务在同一时间间隔内执行,而并行则意味着这些任务是...
总之,通过深入学习Locks框架,尤其是ReentrantLock,开发者可以更好地理解和掌握Java多线程中的同步控制,提升并发程序的效率和安全性。了解ReentrantLock的工作原理、用法及其与`synchronized`的区别,将有助于...
- **同步机制**:Java提供`synchronized`关键字、`Lock`接口(如`ReentrantLock`)来确保线程安全,防止数据竞争。 2. **并发控制** - **锁机制**:包括互斥锁、读写锁、自旋锁等,用于控制对共享资源的访问。 -...
标题《阿里Java并发程序设计教程》揭示了这是一份面向Java开发者的教程,专注于介绍Java中的并发编程技术。该教程将Java并发编程的核心概念进行了系统性的讲解,涵盖了从基础到高级的多个方面。而描述部分列举了教程...