Java多线程同步设计中使用Metux

2016-02-19 14:31 6 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的Java多线程同步设计中使用Metux,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】


  
  Mutex是互斥体,广泛地应用在多线程编程中。本文以广为流程的Doug Lea的concurrent工具包的Mutex实现为例,进行一点探讨。在Doug Lea的concurrent工具包中,Mutex实现了Sync接口,该接口是concurrent工具包中所有锁(lock)、门(gate)和条件变量(condition)的公共接口,Sync的实现类主要有:Mutex、Semaphore及其子类、Latch、CountDown、ReentrantLock等。这也体现了面向抽象编程的思想,使我们可以在不改变代码或者改变少量代码的情况下,选择使用Sync的不同实现。下面是Sync接口的定义:
  
  public interface Sync
  {
   public void acquire() throws InterruptedException;
   //获取许可
   public boolean attempt(long msecs) throws InterruptedException;
   //尝试获取许可
   public void release();
   //释放许可
  }
  
  通过使用Sync可以替代Java synchronized要害字,并提供更加灵活的同步控制。当然,并不是说 concurrent工具包是和Java synchronized独立的技术,其实concurrent工具包也是在synchronized的基础上搭建的,从下面对Mutex源码的解析即可以看到这一点。synchronized要害字仅在方法内或者代码块内有效,而使用Sync却可以跨越方法甚至通过在对象之间传递,跨越对象进行同步。这是Sync及concurrent工具包比直接使用synchronized更加强大的地方。
  
  注重Sync中的acquire()和attempt()都会抛出InterruptedException,所以使用Sync及其子类时,调用这些方法一定要捕捉InterruptedException。而release()方法并不会抛出InterruptedException,这是因为在acquire()和attempt()方法中可能会调用wait()等待其它线程释放锁。而release()在实现上进行了简化,直接释放锁,不管是否真的持有。所以,你可以对一个并没有acquire()的线程调用release()这也不会有什么问题。而由于release()不会抛出InterruptedException,所以我们可以在catch或finally子句中调用release()以保证获得的锁能够被正确释放。比如:
  
  class X
  {
   Sync gate; // ...
   public void m()
   {
  try
  {
   gate.acquire();
   // block until condition holds
   try
   {
  // ... method body
   }
   finally { gate.release(); }
  }
  catch (InterruptedException ex) { // ... evasive action }
   }
  }
  Mutex是一个非重入的互斥锁。Mutex广泛地用在需要跨越方法的before/after类型的同步环境中。下面是Doug Lea的concurrent工具包中的Mutex的实现。
  
  public class Mutex implements Sync
  {
   /** The lock status **/
   protected boolean inuse_ = false;
   public void acquire() throws InterruptedException
   {
  if (Thread.interrupted()) throw new InterruptedException();//(1)
  synchronized(this)
  {
   try
   {
  while (inuse_) wait();
  inuse_ = true;
   }
   catch (InterruptedException ex)
   {
  //(2)
  notify();
  throw ex;
   }
  }
   }
  
   public synchronized void release()
   {
  inuse_ = false;
  notify();
   }
  
   public boolean attempt(long msecs) throws InterruptedException
   {
  if (Thread.interrupted()) throw new InterruptedException();
  synchronized(this)
  {
   if (!inuse_)
   {
  inuse_ = true;
  return true;
   }
   else if (msecs = 0)
  return false;
   else
   {
  long waitTime = msecs;
  long start = System.currentTimeMillis();
  try
  {
   for (;;)
   {
  wait(waitTime);
  if (!inuse_)
  {
   inuse_ = true;
   return true;
  }
  else
  {
  

来源:http://www.tulaoshi.com/n/20160219/1607132.html

延伸阅读
标签: Java JAVA基础
限制线程优先级和调度 Java 线程模型涉及可以动态更改的线程优先级。本质上,线程的优先级是从 1 到 10 之间的一个数字,数字越大表明任务越紧急。JVM 标准首先调用优先级较高的线程,然后才调用优先级较低的线程。但是,该标准对具有相同优先级的线程的处理是随机的。如何处理这些线程取决于基层的操作系统策略。在某些...
一、理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 多...
多线程是Java语言的一大特性,多线程就是同时存在N个执行体,按几条不同的执行线索共同工作的情况。程序,进程,线程,可以从不同的角度去理解。 !-- frame contents -- !-- /frame contents -- 程序就是一段静态的代码,可以理解成一组计算机命令的集合.进行就是这个程序一次动态的执行过程,从代码的加载到执行完毕的一个过...
一、理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作 系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。 多个线程的执行...
为什么会排队等待? 下面的这个简单的 Java 程序完成四项不相关的任务。这样的程序有单个控制线程,控制在这四个任务之间线性地移动。 !-- frame contents -- !-- /frame contents -- 此外,因为所需的资源 — 打印机、磁盘、数据库和显示屏 -- 由于硬件和软件的限制都有内在的潜伏时间,所以每项任务都包含明显的等待时间。因...

经验教程

810

收藏

15
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部