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

几种同步工具介绍

    博客分类:
  • Java
阅读更多

下面的内容基本上来自于《Java并发编程实践》, 留个记录~

 

一,CountDownLatch

CountDownLatch是一个灵活的闭锁的实现,允许一个或多个线程等待一个事件集的发生。

闭锁的状态包括一个计数器,初始化为一个正数,用来表现需要等待的事件数。countDown方法对计数器做减操作,表示一个事件已经发生了,而await方法会一直阻塞直到计数器为0,或者等待线程中断以及超时。

 

下面是n个线程并发执行的例子

public class CountDownLatchTest {
	public long concurrentTasks(int nThreads, final Runnable task) throws InterruptedException {
		final CountDownLatch startGate = new CountDownLatch(1);
		final CountDownLatch endGate = new CountDownLatch(nThreads);
		
		for(int i = 0; i < nThreads; i ++) {
			Thread t = new Thread() {
				public void run() {
					try{
						startGate.await();
						task.run();
					} catch (InterruptedException e) {
						e.printStackTrace();
					} finally {
						endGate.countDown();
					}
				}
			};
			t.start();
		}
		
		long start= System.nanoTime();
		startGate.countDown();
		endGate.await();
		long end = System.nanoTime();
		return end - start;
	}
}

 上面的例子使用了两个阀门,一个“开始阀门”, 一个“结束阀门”。开始阀门将计数器初始化为1,结束阀门将计数器初始化为线程的数量。每一个工作线程做的第一件事是等待开始阀门的打开,这样能确保所有的线程都准备好再开始工作。每个线程的最后一件事是将结束阀门减1,这样是控制线程有效的等待,直到最后一个线程完成任务,这样就能计算线程整个的用时了。

 

二, FutureTask

FutureTask的计算通过Callable实现的,它等价于一个可以携带结果的Runnable,并且有3个状态: 等待,运行和完成。完成包括所有计算以任意的方式结束,包括正常、取消和异常。一旦FutureTask进入完成状态,将会永远停止在这个状态上。

Future.get的行为依赖于任务的状态。如果它已经完成,get可以立即得到结果,否则会阻塞直到任务转入完成状态,然后返回结果或抛出异常。FutureTask把计算的结果从运行计算的线程传送到需要这个结果的线程: FutureTask的规约保证了这种传递建立在结果的安全发布基础之上。

public class FutureTaskTest {
	private FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
		@Override
		public String call() throws Exception {
			System.out.println("Thread name1: " + Thread.currentThread().getName());
			Thread.sleep(3000);
			return "AAA";
		}
	});
	
	public String invokeTask() throws InterruptedException, ExecutionException {
		String pattern = "HH:mm:ss";
		DateFormat format = new SimpleDateFormat(pattern);
		System.out.println("begin: " + format.format(new Date()));
		new Thread(task).start();
		System.out.println("Thread name2: " + Thread.currentThread().getName());
		String result = task.get();
		System.out.println("end: " + format.format(new Date()));
		System.out.println("result: " + result);
		return result;
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		FutureTaskTest test = new FutureTaskTest();
		test.invokeTask();
	}
}

 运算的结果如下:

begin: 11:17:46
Thread name2: main
Thread name1: Thread-0
end: 11:17:49
result: AAA
由此可知,在执行get方法时,main线程等待FutureTask的计算结果,处于阻塞状态。

 

 

三, 信号量

信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数量。计数信号量可以用来实现资源池或者给一个容器限定边界。

信号量可以用来实现资源池,比如数据库连接池。有一个定长的池,当它为空时,你向它请求资源会失败。构建这种池很容易,然而当池为空时,你真正需要做的是阻塞它,然后在不为空时,再次解除阻塞。如果你以池的大小初始化一个Semaphore,在你从池中获取资源之前,你应该用acquire方法获取一个许可,调用release把许可放回资源池。acquire会一直阻塞,直到池不为空。

public class SemaphoreTest {
	private Semaphore semaphore;
	private List<String> stringList = new ArrayList<String>();

	public SemaphoreTest(int n) {
		semaphore = new Semaphore(n);
	}
	
	public void addElement(String ele) {
		try {
			semaphore.acquire();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		stringList.add(ele);
	}
	
	public String removeElement() {
		String ele = stringList.remove(stringList.size() - 1);
		semaphore.release();
		return ele;
	}
}

 

 

 

分享到:
评论

相关推荐

    windows时间同步工具

    Windows操作系统中的时间同步工具可以帮助用户确保本地计算机的时间与指定的服务器时间保持一致,从而保证系统间的操作协调性和数据完整性。本篇文章将深入探讨“Windows时间同步工具”,以及如何设置和利用它来与...

    数据同步工具

    实现Oracle和SQL数据库数据同步的方法多种多样,常见的有以下几种: 1. **触发器和存储过程**:通过在源数据库和目标数据库上创建触发器和存储过程,当数据发生变化时,自动调用这些程序来更新另一端的数据库。 2....

    文件夹实时同步工具

    文件夹实时同步工具是一种软件应用,它主要用于在两个或多个文件夹之间实时地、自动地保持数据的一致性。这种工具对于那些需要在不同设备、网络位置或备份存储之间保持文件最新状态的用户来说非常有用。例如,开发...

    手机同步工具ActiveSync 4.1

    ActiveSync 4.1是一款由微软开发的手机同步软件,主要针对Windows Mobile设备,它为开发者和普通用户提供了一种高效的方式将数据和应用程序...通过这个压缩包中的文件,用户可以重新安装和体验这一经典同步工具的功能。

    文件同步工具

    文件同步的策略通常有以下几种: 1. 单向同步:只将源文件夹的更改应用到目标文件夹。 2. 双向同步:当源文件夹和目标文件夹都有更改时,需要解决冲突问题。这可能涉及比较文件的修改时间,或者询问用户如何处理。 ...

    windows线程几种同步方式

    本篇文章将详细探讨在C++环境下,Windows系统中的几种线程同步机制:Mutex、Event以及Semaphore。 1. **Mutex(互斥量)** Mutex是一种基本的线程同步工具,用于保护共享资源免受多个线程同时访问。当一个线程获得...

    FTP下载同步工具(delphi源码)

    在FTP同步工具中,核心知识点主要包括以下几个方面: 1. FTP协议:FTP(File Transfer Protocol)是一种用于在网络上进行文件传输的标准协议,允许用户从远程主机上传、下载文件。FTP同步工具的关键在于正确实现FTP...

    时间同步工具timesync(免费解版)

    很好用的时间同步工具,很人性化,很好设置。我很喜欢。 软件名称: Express TimeSync v3.0.4 软件类别: 闹铃时钟 应用平台: Win9x/NT/2000/XP 开 发 商: http://www.express-computing.com/ 汉化作者: ...

    数据库同步工具utscninfo

    UTSCNINFO具备这两种同步方式,可以根据实际需求选择合适的方法。 在工作原理上,UTSCNINFO可能会利用触发器、日志解析或者Change Data Capture (CDC)技术来跟踪数据库中的变更。触发器可以在数据修改时自动执行...

    文件同步工具 GoodSync Enterprise 10.5.6 + x64 中文企业免费版

    文件同步工具 GoodSync Enterprise 10.5.6 + x64 中文企业免费版。文件同步工具 GoodSync 中文版可以实现两台电脑或者电脑与U盘之间的数据和文件的同步转换。通过此工具,可以备份U盘中Pass2Go 中的数据或者其他文件...

    进程同步的几种机制

    本文主要介绍两种主要的关系:同步与互斥,并着重讲解解决进程同步的几种机制。 ##### 进程互斥 进程互斥指的是多个进程对同一资源的访问控制。当两个或多个进程需要访问同一个共享变量时,如果这些进程同时访问...

    不错的局域网内定时同步工具

    总的来说,这款局域网内定时同步工具为用户提供了一种高效、省资源的方式,确保了局域网内多设备间的数据同步和一致性,提高了团队协作的效率。同时,增量同步特性使得它特别适合那些需要频繁更新和共享文件的环境。...

    SYNC和Synctoy同步工具

    "SYNC"和"Synctoy"就是两种常见的文件同步工具,分别在不同的操作系统环境下提供服务。 首先,我们来详细了解"SYNC"。"SYNC"通常指的是Unix/Linux环境下的命令行工具,用于确保文件系统的一致性。它主要的功能是将...

    文件时间戳记同步工具

    文件时间戳记同步工具是一种实用程序,主要用于管理和调整文件及文件夹的时间属性,尤其是修改日期、创建日期和访问日期。这些时间戳记是文件系统中记录的重要信息,它们反映了文件在系统中的活动历史。在某些情况下...

    数据源同步工具DATAX

    数据源同步工具DATAX,全称为Data Exchange,是阿里巴巴开源的一款高效、稳定、强大的数据同步工具。它在IT行业中扮演着重要角色,特别是在大数据处理领域,帮助企业和开发者实现了各种数据源之间的数据迁移和同步。...

    windows时间自动同步工具

    时间和日期显示根据用户的区域设置。精度通常在一秒钟内。TimeSync会尝试替代服务器,如果首选服务器获得时间不能。 TimeSync选项/自动提供从Windows任务计划程序运行TimeSync。...几种语言文件可供使用。

    数据库同步迁移小工具

    数据库同步迁移小工具是一种用于在不同的数据库系统之间转移数据或保持数据实时一致性的实用程序。在IT领域,尤其是在企业级应用中,数据的迁移和同步是常见的需求,例如在升级数据库版本、迁移至新的数据库平台或者...

    3种多线程实现同步方法

    互斥量是另一种互斥访问的同步工具,与临界区类似,但更适用于跨进程的同步。在C++11标准中,我们可以使用std::mutex类来创建和管理互斥对象。在互斥对象.cpp文件中,每个线程在访问共享资源前需要先调用lock()方法...

    几种常用的ORM工具测试比较

    本文将对几种常见的ORM工具进行测试比较,包括Ado.net、Entity Framework (EF)、Dapper、Subsonic以及LinqToSql。 1. Ado.net:Microsoft开发的一种数据库访问技术,它是.NET Framework的一部分。Ado.net提供了对...

    虚拟机同步教程

    #### 三、虚拟机同步工具介绍 市面上存在多种虚拟机同步工具,本教程将详细介绍一种名为“MouseWithoutBorders”(无界鼠标)的工具及其使用方法。“MouseWithoutBorders”是一款由微软开发的小工具,能够实现多台...

Global site tag (gtag.js) - Google Analytics