`

多线程之ReentrantLock 和 Condition

 
阅读更多
package com.test3;


import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
/**
 * 线程通信例子(基于可重入锁ReentrantLock,一对Condition实现)
 * */
public class PC2 {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Q2 q = new Q2();
        new Producer2(q);
        new Customer2(q);
    }
}
/**
 * 阻塞队列
 * */
class Q2{
    int n;
    final Lock lock = new ReentrantLock();
    //说明:canGet和canPut可以合并成一个
    final Condition canGet = lock.newCondition();
    final Condition canPut = lock.newCondition();
    boolean valueSet = false;
     
    int get(){
        //实现可响应中断的锁
        try {
            lock.lockInterruptibly();
            //值未设置好,循环等待
            while(!valueSet){
                canGet.await();
            }
            //取值成功
            System.out.println("Got:"+n);
            //将设置标志置为false
            valueSet = false;
            Thread.currentThread().sleep(1000);
            //通知设值线程
            canPut.signal();
            return n;
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }finally{
            lock.unlock();
        }
        return 0;
    }
    void put(int n){
        try {
            //实现可响应中断的锁
            lock.lockInterruptibly();
            //已经设置好了值,而且未被取走,循环等待
            while(valueSet){
                canPut.await();
            }
            this.n = n;
            //将设置标志设置为true
            valueSet = true;
            System.out.println("Put:"+n);
            Thread.currentThread().sleep(1000);
            //通知取值线程,可以取值
            canGet.signal();//相当于notify() ,signalAll()相当于notifyAL
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}
/**
 * 生产者
 * */
class Producer2 implements Runnable{
    Q2 q;
    public Producer2(Q2 q){
        this.q = q;
        new Thread(this,"Producer").start();
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        int i=0;
        while(true){
            q.put(i++);
        }
    }
}
/**
 * 消费者
 * */
class Customer2 implements Runnable{
    Q2 q;
    public Customer2(Q2 q){
        this.q=q;
        new Thread(this,"Customer").start();
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            q.get();
        }
    }
}


分享到:
评论

相关推荐

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    Java中的`ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个高级锁机制,它是可重入的互斥锁,具有与`synchronized`关键字...在设计和实现多线程程序时,了解和正确使用`ReentrantLock`是非常重要的。

    Java多线程中ReentrantLock与Condition详解

    Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...

    Java多线程ReentrantLock1

    总结来说,ReentrantLock在Java多线程编程中扮演着关键角色,提供了灵活的锁管理机制,包括公平性和非公平性选择,以及可中断和定时的锁获取方式。了解和熟练掌握ReentrantLock的使用,能够帮助开发者编写出高效、...

    java多线程系列(四)ReentrantLock的使用.docx

    Java中的多线程编程在处理并发问题时是至关重要的,特别是在高并发环境下,对资源的精确控制成为提高系统效率的关键。本篇文章将深入探讨`ReentrantLock`的使用,它是Java并发包`java.util.concurrent.locks`中的一...

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

    5. **ReentrantLock和Condition**:如果不想使用`synchronized`关键字,可以使用`java.util.concurrent.locks.ReentrantLock`和`Condition`接口,它们提供了更细粒度的锁控制和更灵活的等待/通知机制。 6. **死锁和...

    Java多线程 ReentrantLock互斥锁详解

    Java多线程ReentrantLock互斥锁详解 ReentrantLock是Java多线程编程中的一种锁机制,它可以实现线程之间的同步访问资源。ReentrantLock的主要特点是可以重入,即一个线程可以多次获得锁,而不需要释放锁。这种机制...

    java多线程加锁以及Condition类的使用实例解析

    摘要:本篇文章主要介绍了 Java 多线程加锁机制和 Condition 类的使用实例解析,通过示例代码详细介绍了多线程加锁和 Condition 类的使用方法,对大家的学习或者工作具有一定的参考学习价值。 一、Java 多线程加锁...

    java ReentrantLock详解.docx

    `ReentrantLock`提供了更多的选择和控制。例如,可以通过构造函数传入`true`参数创建公平锁,这样线程会按照等待顺序获取锁,而不是像非公平锁那样随机获取。默认情况下,`ReentrantLock`是非公平的。`lock.isFair...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    操作系统,多线程编程,多进程编程,java

    Java提供了一系列的同步机制来解决这些问题,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)和Condition对象。实验指导书中可能详细讲解了如何使用这些工具确保线程...

    【JAVA多线程】多线程编程核心技术学习资料

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术尤其关键,因为它们能够充分利用多核处理器的能力。这份"Java多线程编程...

    多线程案例,多线程教程

    在编程领域,多线程是一种常见的技术,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。本文将深入探讨多线程的概念、重要性以及如何在实际项目中应用多线程,特别关注Java语言中的多线程实现。...

    Java多线程资料

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...

    多线程+同步+锁和条件+示例

    多线程的使用涉及到一系列概念,如线程同步、锁和条件变量,这些都是确保线程安全和正确性的重要工具。 线程同步是指控制多个线程对共享资源的访问,以防止数据的不一致性和竞态条件。竞态条件是指当两个或更多线程...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    java多线程读写文件示例

    该示例主要介绍了如何使用Java多线程技术来实现文件的读写操作,包括文件的写入、读取和同步控制等。 标题:Java多线程读写文件示例 描述:主要介绍了Java多线程读写文件示例,需要的朋友可以参考下 标签:多线程...

    java单线程多线程clientserver

    Java中的单线程和多线程是编程中的关键概念,特别是在服务器端开发中。了解它们的原理和应用对于构建高效、可扩展的客户端-服务器应用至关重要。以下是对这些概念的详细解析。 首先,我们来谈谈单线程。在Java中,...

    Java 多线程 PPT

    Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...

    java多线程进阶

    2. **线程同步**:为了解决多线程中的数据安全问题,Java提供了多种同步机制,如`synchronized`关键字、`volatile`变量、`Lock`与`Condition`接口、`ReentrantLock`等。这些内容在书中会有详细讲解,包括它们的工作...

    java项目史上最简单的多线程使用方法(demo)

    在Java编程中,多线程是一项关键技能,尤其在处理并发任务、提高系统效率和响应速度时至关重要。本文将深入探讨Java项目中最简单的多线程使用方法,通过一个名为"thread-test"的示例项目来讲解如何在企业实际场景中...

Global site tag (gtag.js) - Google Analytics