Java线程与并发编程实践----同步器(交换器、信号量)

一、交换器

交换器提供了一个线程之间能够交换对象的同步点。每个线程都会往这个

交换器的exchange()方法传入一些对象,匹配伙伴线程,同时接受伙伴对象作为返

回值。java.util.conurrent.Exchange<V>实现了交换器。

下面是一个代码小实例:

import java.util.concurrent.Exchanger;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
  
public class ExchangerTest {  
  
    public static void main(String[] args) {  
        ExecutorService service = Executors.newCachedThreadPool();  
        final Exchanger exchanger = new Exchanger();  
        service.execute(new Runnable(){  
            public void run() {  
                try {                 
  
                    String data1 = "zxx";  
                    System.out.println("线程" + Thread.currentThread().getName() +   
                    "正在把数据" + data1 +"换出去");  
                    Thread.sleep((long)(Math.random()*10000));  
                    String data2 = (String)exchanger.exchange(data1);  
                    System.out.println("线程" + Thread.currentThread().getName() +   
                    "换回的数据为" + data2);  
                }catch(Exception e){  
                      
                }  
            }     
        });  
        service.execute(new Runnable(){  
            public void run() {  
                try {                 
  
                    String data1 = "lhm";  
                    System.out.println("线程" + Thread.currentThread().getName() +   
                    "正在把数据" + data1 +"换出去");  
                    Thread.sleep((long)(Math.random()*10000));                    
                    String data2 = (String)exchanger.exchange(data1);  
                    System.out.println("线程" + Thread.currentThread().getName() +   
                    "换回的数据为" + data2);  
                }catch(Exception e){  
                      
                }                 
            }     
        });       
    }  
}

二、信号量

    信号量维护了一组许可证,以约束访问被限制资源的线程数。当没有可用

的许可证时,线程的获取尝试会一直阻塞,直到其它的线程释放一个许可证。

java.util.concurrent.Semaphor实现了这一同步器,同时将信号量概念化成一个

维护一组许可证的对象。他有两个构造器:

Semaphore(int permits)

Semaphore(int permits,boolean fair)

permits指定了许可证的数量,fair是是否设置公平策略,当设置为 false 时,此类不对线

程获取许可的顺序做任何保证。特别地,闯入 是允许的,也就是说可以在已经等待的线程前

为调用 Java线程与并发编程实践----同步器(交换器、信号量)

原文地址:http://blog.51cto.com/12222886/2062970

时间: 2024-08-29 14:31:56

Java线程与并发编程实践----同步器(交换器、信号量)的相关文章

Java线程与并发编程实践----同步器(倒计时门闩)

Java提供的synchronized关键字对临界区进行线程同步访问.由于基于synchronized很难 正确编写同步代码,并发工具类提供了高级的同步器.倒计时门闩(countdown latch).同步屏 障(cyclic barrier).交换器(exchanger).信号量(semaphore)以及phaser同步器.下面主要 介绍倒计时门闩. 倒计时门闩会导致一条或多条线程在"门口"一直等待,直到另一条线程打开这扇门,线程 才得以继续运行.他是由一个计数变量和两个操作组成的,

Java线程与并发编程实践----锁框架

Java.util.concurrent.locks包提供了一个包含多种接口和类的框架,它 针对条件进行加锁和等待.不同于对象的内置加锁同步以及java.lang.Object的等 待/通知机制,包含锁框架的并发工具类通过轮询锁.显示等待及其它方式改善这种 机制. 锁框架包含了经常使用的锁.重入锁.条件.读写锁以及冲入读写锁等类别. 一.锁(Lock) Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作.此实 现允许更灵活的结构,可以具有差别很大的属性,可以

Java线程与并发编程实践----并发工具类与Executor框架

java5之前,我们使用诸如synchronized,wait(),notify()方法对线程的操作属于对 底层线程的操作,这样会出现很多的问题: 低级的并发原语,比如synchronized,wait(),notify()经常难以正确使用.误用会导致 竞态条件,线程饿死,死锁等风险. 泰国依赖synchronized会影响程序性能以及程序的可扩展性 开发者经常需要高级线程结构,如线程池,信号量.java对底层线程的操作不包含这些结. 为解决这些问题,java5引入并发工具类,该工具类主要有下面

Java线程与并发编程实践----额外的并发工具类

一.并发集合 java.util包下提供了很多的集合类,如ArrayList.TreeSet.HashMap,但是这些 集合都是非线程安全的,并且对于单列集合的迭代器,采用的是快速失败机制,当正在迭代 遍历的集合被其它线程修改时,便会抛出 java.util.ConcurrentModificationException. 这显然对于多线程操作的集合是十分不方便的,但早Colections这个工具类中有方法可以返回 线程安全的集合,然而这种集合对于高并发环境,性能十分低下. 于是,java.ut

java线程与并发编程实践(一)

一.给出线程的定义     线程就是一条在程序代码中独立执行的路径 二.给出runnable的定义 一个runnable就是一段封装在对象中的代码序列,它的类实现了runnable接口 三.Thread类和runnable接口完成了什么? 类Thread提供了一个底层操作系统的线程架构的统一接口.Runnable接口为关联了Thread对象的线程提供了执行代码. 四.指出创建一个Runnable对象的两种方式? 创建一个实现Runnable接口的匿名类或者lambda表达式 Runnable r

Java线程与并发编程实践----等待通知(生产者消费者问题)线程

Java提供了一套API来支持线程之间的交互.在Object类中提供了一套等待通知的API  wait()     notify()     notifyAll()     此处要注意的是,绝不要在循环外面调用wait()方法.(单独开一片文章来讨论)     下面使用消费者与生产者问题来展示以上API的使用: package xiancheng; public class PC { public static void main(String[] args) { Shared s = new 

[Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性

根据<Java并发编程实践>一书整理的思维导图.

[Java 并发] Java并发编程实践 思维导图 - 第一章 简介

阅读<Java并发编程实践>一书后整理的思维导图.

读Java并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例

在Java并发编程实践中4.4中提到向客户端加锁的方法.此为验证示例,写的不好,但可以看出结果来. package com.blackbread.test; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public