Java编程技巧(信号量,管道)

转载 2004年06月30日 15:30:00
Java编程技巧(信号量,管道)
本文出自:http://noc.cstnet.net.cn/ 瞿宏阳 (2001-06-08 15:00:00)

一、信号量 

在进行多线程编程时,经常要使用同步互斥机构,但java本身没有提供的同步互斥机构,仅提供了两个与同步互斥有关的方法:wait()和notify(),可以用来设计信号量类:mySemaphore,它是按照Dijkstra提出的计数信号量的思想设计的。 

mySemaphore有两个最重要的成员方法:P()和V()。这两个方法实际就实现了信号量的P操作和V操作。具体描述如下: 

public synchronized void P(){ 

semaphore--; 

if(semaphore<0){ 

try{ 

wait(); 

}catch(InterruptedException ie){} 





public synchronized void V(){ 

semaphore++; 

if(semaphore<=0) 

notify(); 



其中,semaphore变量记录了信号量的状态,wait()方法相当于block原语,用于阻塞线程的执行,notify()方法相当于wakeup原语,用于唤醒线程恢复运行。由于这两个方法定义为synchronized,这样java虚拟机可保证这两个方法的原子执行,从而实现了P、V操作。 

二、管道 

并发程序的多个线程之间的通讯通常是使用管道进行,jdk提供了两个管道类:PipedInpuStream和PipedOutputStream,前者用于输入,后者用于输出。这两种管道应该是能够多次连接和关闭,在实现过程中,却发现它们在关闭后,不能重新建立连接。经过仔细调试后,发现jdk的源代码在处理关闭时释放资源存在着缺陷,因此需要编写自己的管道类:MyPipedInputStream和MyPipedOutputStream。这两个类直接从InputStream和OutputStream继承而来,其成员方法与实现基本与PipedInputStream和PipedOutputStream一致,只是在处理关闭时,将类中的成员变量的值恢复成未连接时的初始值。另外,原有的管道了提供的管道容量只有1024个字节,在传输数据量较大时,可能会发生溢出,而在自己的管道类中可以任意设置管道容量,例如可以根据需要把管道容量设为64KB。以下仅给出了相应的关闭例程: 

1.MyPipedInputStream 

public void close() throws IOException { 

in = -1; 

out = 0; 

closedByReader = true; 

connected = false; 

closed = true; 

buffer = new byte[PIPE_SIZE]; 



2.MyPipedOutputStream 

public void close() throws IOException { 

if (sink != null) { 

sink.receivedLast(); 

sink.closed = true; 



sink = null; 

connected = false; 

}

Linux进程间通信方式--信号,管道,消息队列,信号量,共享内存

通信方法 无法介于内核态与用户态的原因 管道(不包括命名管道) 局限于父子进程间的通信。 消息队列 在硬、软中断中无法无阻塞地接收数据。 信...
  • yangcs2009
  • yangcs2009
  • 2014年09月30日 16:22
  • 4246

微信公众号后台素材编辑及群发简易图示流程

电梯直达楼主 发表于 2015-9-2 13:21:05 | 只看该作者 |只看大图 1、点击“素材管理”,选择“图文消息”——“新建图文消息”; 2、点击“+”可以增加消息的数目(最多是8条信息),...
  • newhappy2008
  • newhappy2008
  • 2016年12月06日 17:06
  • 4999

Linux进程间通信--信号,管道,消息队列,信号量,共享内存,socket

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面...
  • B_H_L
  • B_H_L
  • 2013年12月03日 17:31
  • 6403

java并发编程系列之Semaphore信号量的使用

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。一个计数信号量,从概念上讲,信号量维护了一个许可集。如有...
  • liuchuanhong1
  • liuchuanhong1
  • 2016年12月09日 15:34
  • 541

Java并发编程(七)——闭锁、同步屏障、信号量详解

目录(?)[+]闭锁CountDownLatch1 使用场景2 代码实现同步屏障CyclicBarrier1 使用场景2 闭锁 与 同步屏障 的区别3 代码实现信号量Semaphore1 使用场景2 ...
  • qq_31390937
  • qq_31390937
  • 2017年05月16日 21:33
  • 213

【Java并发编程】并发新特性—信号量Semaphore(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17524153     在操作系统中,信号量是个很重要的概念,它在控制进程...
  • mlj1668956679
  • mlj1668956679
  • 2014年01月17日 14:59
  • 481

Java7并发编程--3.1、信号量Semaphore机制

信号量是一种计数器,用来保护一个或多个共享资源的保护。        如果线程要访问一个共享资源,它首先必须获得信号量。如果信号量的内部计数器大于0,则信号量减1,然后允许访问这个共享资源。计数器大于...
  • u010010428
  • u010010428
  • 2016年08月11日 01:37
  • 219

《java并发编程实战》:线程同步辅助类之信号量(semaphore)

1.信号量的概念: 信号量是一种计数器,用来保护一个或者多个共享资源的访问,它是并发编程的一种基础工具,大多数编程语言都提供了这个机制。 2、信号量控制线程访问流程: 如果线程要访问一个共享资源,...
  • u010758482
  • u010758482
  • 2016年10月16日 22:31
  • 287

JAVA并发编程-障碍器CyclicBarrier,计数器CountDownLatch,信号量Semaphore

CountDownLatch利用它可以实现类似计数器的功能。 比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了 构造器...
  • weixin_36321914
  • weixin_36321914
  • 2016年10月07日 20:36
  • 138

【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)

在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作用,通过对信号量的不同操作,可以分别实现进程间的互斥与同步。当然它也可以用于多线程的控制,我们完全可以通过使用信号量来自定...
  • mmc_maodun
  • mmc_maodun
  • 2013年12月25日 08:11
  • 10651
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java编程技巧(信号量,管道)
举报原因:
原因补充:

(最多只允许输入30个字)