`
IXHONG
  • 浏览: 453498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lock&Condition

阅读更多
package com.ixhong.base.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreeConditionCommunication {

   /**
    * @param args
*/
public static void main(String[] args) {
      
      final Business business = new Business();
      new Thread(
            new Runnable() {
               
               @Override
public void run() {
               
                  for(int i=1;i<=50;i++){
                     business.sub2(i);
                  }
                  
               }
            }
      ).start();
      
      new Thread(
            new Runnable() {
               
               @Override
public void run() {
               
                  for(int i=1;i<=50;i++){
                     business.sub3(i);
                  }
                  
               }
            }
      ).start();    
      
      for(int i=1;i<=50;i++){
         business.main(i);
      }
      
   }

   static class Business {
         Lock lock = new ReentrantLock();
         Condition condition1 = lock.newCondition();
         Condition condition2 = lock.newCondition();
         Condition condition3 = lock.newCondition();
        private int shouldSub = 1;
        public  void sub2(int i){
           lock.lock();
           try{
              while(shouldSub != 2){
                 try {
                  condition2.await();
               } catch (Exception e) {
                  // TODO Auto-generated catch block
e.printStackTrace();
               }
              }
               for(int j=1;j<=10;j++){
                  System.out.println("sub2 thread sequence of " + j + ",loop of " + i);
               }
              shouldSub = 3;
              condition3.signal();
           }finally{
              lock.unlock();
           }
        }

        public  void sub3(int i){
           lock.lock();
           try{
              while(shouldSub != 3){
                 try {
                  condition3.await();
               } catch (Exception e) {
                  // TODO Auto-generated catch block
e.printStackTrace();
               }
              }
               for(int j=1;j<=20;j++){
                  System.out.println("sub3 thread sequence of " + j + ",loop of " + i);
               }
              shouldSub = 1;
              condition1.signal();
           }finally{
              lock.unlock();
           }
        }         
        
        public  void main(int i){
           lock.lock();
           try{
             while(shouldSub != 1){
                  try {
                     condition1.await();
                  } catch (Exception e) {
                     // TODO Auto-generated catch block
e.printStackTrace();
                  }
               }
               for(int j=1;j<=100;j++){
                  System.out.println("main thread sequence of " + j + ",loop of " + i);
               }
               shouldSub = 2;
               condition2.signal();
        }finally{
           lock.unlock();
        }
     }
   
   }
}
1
2
分享到:
评论

相关推荐

    JavaLock与Condition的理解Reentran

    本文将深入探讨JavaLock中的ReentrantLock(可重入锁)以及与其紧密相关的Condition接口,帮助你理解它们的工作原理和应用场景。 **一、ReentrantLock可重入锁** ReentrantLock是Java.util.concurrent.locks包下的...

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

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

    java中的Lock类和Condition类.docx

    Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...

    C++11中的mutex, lock, condition variable实现分析

    C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装。不过里面也有很多细节值得学习。  std::mutex  先来看下std::mutex:  包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛...

    Lock、Condition实现简单的生产者消费者模式示例

    在这个示例中,使用了Java的`java.util.concurrent.locks`包中的`Lock`接口和`Condition`接口来实现这一模式。`Lock`接口提供了比`synchronized`更精细的锁控制,而`Condition`接口则允许我们创建特定条件的等待队列...

    Lock总结.doc

    5. **锁绑定条件**:`Lock`提供了`Condition`接口,可以创建多个条件变量,每个条件对应一个等待队列,而`synchronized`只有一个等待队列。 6. **公平性**:`ReentrantLock`可以通过构造函数选择公平锁或非公平锁,...

    condition_variable源码以及详细分析.docx

    它通常与互斥锁(Mutex)和锁_guard(Lock_Guard)一起使用,以实现线程安全的数据共享。 Condition_Variable 的主要成员函数 Condition_Variable 提供了多种成员函数来实现线程同步,包括: * wait():等待条件...

    c#线程 lock用法

    `lock`语句是C#中用于实现线程同步的重要工具,主要是为了解决多个线程并发访问共享资源时可能出现的竞争条件(race condition)问题。在描述的场景中,`lock`关键字被用来确保在同一时间只有一个线程可以访问特定的...

    C# lock一个简单实例

    在多线程环境中,多个线程可能同时尝试修改同一份数据,如果不加以控制,可能会导致数据不一致或者竞争条件(race condition)。`lock`语句通过获取一个对象的锁,阻止其他线程在同一时间对该对象进行访问,从而确保...

    Java的Lock小结

    - **newCondition()**:创建一个新的`Condition`对象,用于实现更复杂的锁等待条件。 #### 六、ReentrantLock `ReentrantLock`是`Lock`接口的一个实现,提供了可重入锁的功能,即同一线程可以多次获取同一个锁。...

    解决ArcSDE版本lock问题

    ### 解决ArcSDE版本lock问题 #### 一、引言 在GIS(地理信息系统)领域,ArcSDE 是一种广泛使用的空间数据库引擎,它能够有效地管理大量的空间数据。然而,在实际操作过程中,用户可能会遇到...

    第四节(Lock关键字用法)

    此外,`Lock`接口还支持更复杂的并发控制策略,如可中断的锁等待(`tryLock()`方法),以及通过`Condition`对象实现线程间的条件等待和精确唤醒。 在实际应用中,`ReentrantLock`是`Lock`接口最常见的实现,它具有...

    Java多线程中ReentrantLock与Condition详解

    Condition对象可以通过Lock对象的newCondition()方法创建,每个Lock对象可以创建多个Condition对象。Condition对象提供了await()、signal()、signalAll()等方法,用于控制线程的等待和唤醒。 Condition的使用: *...

    Nachos的线程管理模块升级

    【线程管理模块升级】 在操作系统的设计和实现中,线程管理是核心组成部分之一,它涉及到线程的创建、销毁、调度以及同步互斥等问题。Nachos是一个开源的类UNIX操作系统,提供了一个教学和研究操作系统的平台。...

    Java基于Lock的生产者消费者模型示例

    本示例中,我们使用了Lock和Condition来实现生产者消费者模型,避免了使用synchronized关键字的方式,而是使用了Lock和Condition来实现线程同步和通信,提高了程序的性能和可读性。 知识点: * Java中的生产者消费...

    56.Lock-ReentranLock-使用多个Condition实现通知部分线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java concurrency之Condition条件_动力节点Java学院整理

    private static Condition condition = lock.newCondition(); public static void main(String[] args) { ThreadA ta = new ThreadA(condition); ta.start(); lock.lock(); try { System.out.println(Thread...

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

    条件变量(Condition)是Lock的一个扩展,它允许线程等待特定条件满足后再继续执行。每个Lock对象可以有多个条件变量。例如,Condition接口提供了以下方法: 1. await():使当前线程进入等待状态,直到被信号...

    Lock详解.pdf

    《Lock详解——深入理解Java并发编程的基石》 在Java并发编程中,Lock接口及其实现是不可或缺的一部分。本文将深入探讨Lock接口的核心实现——ReentrantLock,以及它背后的抽象队列同步器...

Global site tag (gtag.js) - Google Analytics