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互斥锁是一种确保在多线程或者多任务执行环境中,对于共享资源的访问是互斥的,即在任何时刻只有一个任务可以访问该资源。这种机制在多线程编程中至关重要,因为它可以避免竞态条件,即当多个线程试图同时...
- **ReentrantLock类**:这是一个可重入的互斥锁,比synchronized更灵活,提供了一系列高级功能。 - **ReentrantReadWriteLock类**:提供了一种读写分离的锁机制,允许多个读操作同时进行但不允许读写或写写并发。 ...
STM是一种替代锁的并发控制机制,它允许程序员在代码块中声明事务,系统会自动处理事务内的并发冲突。STM通过回滚和重试来解决冲突,提供了一种更简洁的编程模型。 综上所述,互斥与同步是并发控制的核心,它们与...
3. 原子操作(Atomic Operations):在某些场景下,如无锁编程,原子操作可以替代互斥量,但其使用较为复杂且不是所有操作都支持原子性。 五、总结 互斥量是实现多线程同步的有效工具,能确保共享资源在同一时间仅...
**5.4 替代互斥锁** 探讨如何使用GCD中的原子操作和信号量来替代传统的互斥锁。 **5.5 替代“生产者-消费者”模式** 学习如何使用GCD来实现生产者-消费者模式。 **5.6 替代信号量** 探讨如何用GCD中的信号量来...
- **ReentrantLock 和 Condition**:`ReentrantLock` 是一个可重入的互斥锁,它拥有比 `synchronized` 更多的功能,如公平锁、尝试锁等。`Condition` 是与 `ReentrantLock` 配合使用的条件对象,可以替代传统的 `...
此库可能提供了各种类型的锁,如互斥锁(`mutex`)、读写锁(`RLock`)等,以确保在并发访问时的安全性。 3. **条件变量**:条件变量是一种同步原语,允许线程在满足特定条件时等待,直到其他线程改变了条件。`...
- **使用并发原语而非显式锁**:原语通常效率更高,如`AtomicInteger`替代`synchronized int`。 8. **并发编程实践**: - **线程池的最佳实践**:根据任务类型和系统资源合理配置线程池大小。 - **并发测试**:...
Java并发编程是Java开发中的重要领域,涉及到多线程、并发控制、同步机制等多个知识点。...在实际开发中,应根据具体场景选择合适的并发控制手段,合理利用Java提供的并发库,以达到最优的性能和可维护性。
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 ... Java并发程序中的串行,主要来自独占的资源锁 优化策略 缩
2. **Phaser**:Java 7引入的新工具,可替代CountDownLatch和CyclicBarrier,具有更灵活的分阶段并发控制。 六、线程池 Java的 **Executor框架** 提供了线程池服务,通过ThreadPoolExecutor可以定制线程池的行为,...
- **正确使用原子操作:** 对于简单的数据操作,可以考虑使用原子操作来替代复杂的锁机制。 综上所述,互斥和协作是线程编程中的两个核心概念,对于编写高效稳定的多线程应用程序至关重要。通过正确理解和应用这些...
本大作业旨在让学生理解并熟练运用POSIX提供的同步机制,特别是互斥锁和条件变量,来解决这个问题。以下是相关知识点的详细说明: 1. **互斥锁**:在多线程环境中,互斥锁用于保护共享资源,确保同一时间只有一个...