多线程通讯之共享内存二(可重用锁)

1.三个线程交替各打印15次,如此循环10次。

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

public class ReentrantLockAndThreadTask {
    //三个任务依次执行15次,共执行10轮
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final Transaction tran = new Transaction();

        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for (int i = 0 ; i < 15; i ++){
                    tran.sub2(i);
                }
            }
        }).start();
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                for (int i = 0 ; i < 15; i ++){
                    tran.sub3(i);
                }
            }
        }).start();
        for (int i = 0 ; i < 15; i ++){
            tran.sub1(i);
        }
    }

}
class Transaction{
    private int turn = 1;
    ReentrantLock tranLock = new ReentrantLock(true);
    Condition condition1 = tranLock.newCondition();
    Condition condition2 = tranLock.newCondition();
    Condition condition3 = tranLock.newCondition();
    public void sub1(int j){
        tranLock.lock();
        try {
            while (turn != 1){
                //如果不是第一个线程的轮次就等待
                condition1.await();
                System.out.println("111");
            }
            for (int i = 0 ; i < 15; i ++){
                System.out.println(Thread.currentThread().getName()+"正在执行第:"+j+"次序列号是:"+i);;
            }
            turn = 2;
            condition2.signal();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            tranLock.unlock();
        }
    }
    public void sub2(int j){
        boolean ishold = tranLock.isHeldByCurrentThread();
        int num = tranLock.getHoldCount();
        tranLock.lock();
        int num1 = tranLock.getHoldCount();
        boolean ishold1 = tranLock.isHeldByCurrentThread();
        try {
            while (turn != 2){
                //如果不是第一个线程的轮次就等待
                condition2.await();
                System.out.println("222");
            }
            for (int i = 0 ; i < 15; i ++){
                System.out.println(Thread.currentThread().getName()+"正在执行第:"+j+"次序列号是:"+i);;
            }
            turn = 3;
            condition3.signal();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            tranLock.unlock();
        }
    }
    public void sub3(int j){
        tranLock.lock();
        try {
            while (turn != 3){
                //如果不是第一个线程的轮次就等待
                condition3.await();
                System.out.println("333");
            }
            for (int i = 0 ; i < 15; i ++){
                System.out.println(Thread.currentThread().getName()+"正在执行第:"+j+"次序列号是:"+i);;
            }
            turn = 1;
            condition1.signal();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            tranLock.unlock();
        }
    }
}
时间: 2024-11-17 07:22:34

多线程通讯之共享内存二(可重用锁)的相关文章

linux_c开发(5-4)进程间通讯_共享内存通讯

共享内存 共享内存 是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快方法,一个进程向共享内存写入了数据,共享这个内存的所有进程就可以立刻看到其中内容. 共享内存实现分为两个步骤 1.创建共享内存,使用shmget函数. 2.映射共享内存,将创建的这段共享内存映射到具体的进程空间去,使用shmat函数. int shmget(key_t key,int size,int shmflg) key标志共享内存的键值:O/IPC_PRIVATE.当key的取值为IPC/PRIVATE

win32进程间通讯--共享内存

小白一枚,如有不对,请各位大神多多指教! 最近看了看win32进程间通讯.简单写了写利用共享内存实现进程间通讯 使用共享内存实现进程间通讯: 1.在WM_CREATE消息下创建文件映射内核对象 1 hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, (LPCWSTR)szName); 2.在需要进行数据共享的地方映射缓存区视图,将要写入的数据放入pbuf 1 pBuf = (c

Nginx 所有worker进程协同工作的关键(共享内存)

以下使用共享内存的模块如下: 共享内存都需要全局锁 1:目前nginx用的锁是自旋锁 2:nginx共享内存都基本用到了rbtree数据结构 原文地址:https://www.cnblogs.com/jackey2015/p/11723820.html

Linux环境编程之共享内存区(二):Posix共享内存区

现在将共享内存区的概念扩展到将无亲缘关系进程间共享的内存区包括在内.Posix提供了两种在无亲缘关系进程间共享内存区的方法: 1.内存映射文件:由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件.(上一节就是这种技术) 2.共享内存区对象:由shm_open打开一个Posix名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址空间.(本节内容) Posix共享内存区涉及以下两个步骤要求: 1.指定一个名字参数调用shm_open

ACE框架 基于共享内存的进程间通讯

ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter.ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略.一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略.不论哪一种策略都要通过socket进行TCP连接,并进行进程

Linux进程间通信--mmap()共享内存(二)

内核怎样保证各个进程寻址到同一个共享内存区域的内存页面 1.page cache及swap cache中页面的区分:一个被访问文件的物理页面都驻留在page cache或swap cache中,一个页面的所有信息由struct page来描述.struct page中有一个域为指针mapping ,它指向一个struct address_space类型结构.page cache或swap cache中的所有页面就是根据address_space结构以及一个偏移量来区分的. 2.文件与addres

共享内存通讯

1.核心理论 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式. 2.函数学习 创建/获取共享内存 函数名:shmget 函数原型:int shmget(key_t key,size_t size,int shmflg) 函数功能:创建或者获取共享内存,并返回其描述符 头文件:<sys/ipc.h> <sys/shm.h> 返回值:成功:返回创建或获取到的共享内存的描述符 失败:-1 参数说明:key:共享内存的键值 size:共

Linux进程间通信--shmget()共享内存(二)

共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容.这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中.但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址. 图 共享内存映射图 象所有的 System V IPC对象一样,对于共享内存对象的获取

一起talk C栗子吧(第九十六回:C语言实例--使用共享内存进行进程间通信二)

各位看官们.大家好,上一回中咱们说的是使用共享内存进行进程间通信的样例,这一回咱们接着上一回内容继续说使用共享内存进行进程间通信. 闲话休提,言归正转.让我们一起talk C栗子吧! 我们在上一回中介绍了共享内存的概念和相关函数的使用方法.这一回中我们通过详细的样例来说明怎样使用共享内存进行进程间的通信.以下是使用共享内存的详细步骤: 1.定义一个结构体类型,用来当作共享内存的类型: 2.使用shmget函数获取共享内存,代码中的键使用了111这个随机数字. 3.使用shmat函数把共享连接到进