`
lijunaccp
  • 浏览: 160451 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

并发库锁条件替代互斥锁

 
阅读更多
package com.test;

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

public class ThreadTest9
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		final Utils9 ts = new Utils9();
		new Thread(){
			@Override
			public void run()
			{
				for (int i = 0; i < 30; i++)
				{
					ts.sub(i);
				}
			}
		}.start();
		
		new Thread(){
			@Override
			public void run()
			{
				for (int i = 0; i < 30; i++)
				{
					ts.sub2(i);
				}
			}
		}.start();
		
		for (int i = 0; i < 30; i++)
		{
			ts.main(i);
		}
	}
	


}

class Utils9{
	
	private int who = 1;
	
	Lock lock = new ReentrantLock();
	Condition condition1 = lock.newCondition();
	Condition condition2 = lock.newCondition();
	Condition condition3 = lock.newCondition();
	
	public void main(int j){
		lock.lock();
		try{
			if(who != 1){
				try
				{
					condition1.await();
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
			for (int i = 1; i <= 5; i++)
			{
				System.out.println("this's main "+j+" runnig is "+i);
			}
			this.who = 2;
			condition2.signal();
		}finally{
			lock.unlock();
		}
	}
	
	public void sub(int j){
		lock.lock();
		try{
			if(who != 2){
				try
				{
					condition2.await();
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
			for (int i = 1; i <= 10; i++)
			{
				System.out.println("this's sub "+j+" runnig is "+i);
			}
			this.who = 3;
			condition3.signal();
		}finally{
			lock.unlock();
		}
	}
	
	public void sub2(int j){
		lock.lock();
		try{
			if(who != 3){
				try
				{
					condition3.await();
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
			for (int i = 1; i <= 6; i++)
			{
				System.out.println("this's sub2 "+j+" runnig is "+i);
			}
			this.who = 1;
			condition1.signal();
		}finally{
			lock.unlock();
		}
	}
}
分享到:
评论

相关推荐

    简单的JavaScript互斥锁分享

    JavaScript互斥锁是一种确保在多线程或者多任务执行环境中,对于共享资源的访问是互斥的,即在任何时刻只有一个任务可以访问该资源。这种机制在多线程编程中至关重要,因为它可以避免竞态条件,即当多个线程试图同时...

    【BAT必备】并发编程锁面试题

    - **ReentrantLock类**:这是一个可重入的互斥锁,比synchronized更灵活,提供了一系列高级功能。 - **ReentrantReadWriteLock类**:提供了一种读写分离的锁机制,允许多个读操作同时进行但不允许读写或写写并发。 ...

    并发控制互斥与同步计算机软件及应用IT计算机专业资料.pptx

    STM是一种替代锁的并发控制机制,它允许程序员在代码块中声明事务,系统会自动处理事务内的并发冲突。STM通过回滚和重试来解决冲突,提供了一种更简洁的编程模型。 综上所述,互斥与同步是并发控制的核心,它们与...

    利用互斥实现多线程同步

    3. 原子操作(Atomic Operations):在某些场景下,如无锁编程,原子操作可以替代互斥量,但其使用较为复杂且不是所有操作都支持原子性。 五、总结 互斥量是实现多线程同步的有效工具,能确保共享资源在同一时间仅...

    iOS 并发编程指南

    **5.4 替代互斥锁** 探讨如何使用GCD中的原子操作和信号量来替代传统的互斥锁。 **5.5 替代“生产者-消费者”模式** 学习如何使用GCD来实现生产者-消费者模式。 **5.6 替代信号量** 探讨如何用GCD中的信号量来...

    大并发编程交流

    - **ReentrantLock 和 Condition**:`ReentrantLock` 是一个可重入的互斥锁,它拥有比 `synchronized` 更多的功能,如公平锁、尝试锁等。`Condition` 是与 `ReentrantLock` 配合使用的条件对象,可以替代传统的 `...

    Python库 | synchronizer_framework-0.0.2-py3-none-any.whl

    此库可能提供了各种类型的锁,如互斥锁(`mutex`)、读写锁(`RLock`)等,以确保在并发访问时的安全性。 3. **条件变量**:条件变量是一种同步原语,允许线程在满足特定条件时等待,直到其他线程改变了条件。`...

    Java并发编程:设计原则与模式(第二版)-3PDF

    - **使用并发原语而非显式锁**:原语通常效率更高,如`AtomicInteger`替代`synchronized int`。 8. **并发编程实践**: - **线程池的最佳实践**:根据任务类型和系统资源合理配置线程池大小。 - **并发测试**:...

    Java 多线程与并发-Java并发知识体系详解.pdf

    Java并发编程是Java开发中的重要领域,涉及到多线程、并发控制、同步机制等多个知识点。...在实际开发中,应根据具体场景选择合适的并发控制手段,合理利用Java提供的并发库,以达到最优的性能和可维护性。

    Java并发编程(学习笔记).xmind

    Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 ... Java并发程序中的串行,主要来自独占的资源锁 优化策略 缩

    java 并发编程实战

    2. **Phaser**:Java 7引入的新工具,可替代CountDownLatch和CyclicBarrier,具有更灵活的分阶段并发控制。 六、线程池 Java的 **Executor框架** 提供了线程池服务,通过ThreadPoolExecutor可以定制线程池的行为,...

    第20章 Part3 多线程互斥与协作.pdf

    - **正确使用原子操作:** 对于简单的数据操作,可以考虑使用原子操作来替代复杂的锁机制。 综上所述,互斥和协作是线程编程中的两个核心概念,对于编写高效稳定的多线程应用程序至关重要。通过正确理解和应用这些...

    OS大作业生产者消费者同步问题的实现

    本大作业旨在让学生理解并熟练运用POSIX提供的同步机制,特别是互斥锁和条件变量,来解决这个问题。以下是相关知识点的详细说明: 1. **互斥锁**:在多线程环境中,互斥锁用于保护共享资源,确保同一时间只有一个...

Global site tag (gtag.js) - Google Analytics