浏览以下内容前,请点击并阅读 声明

  一个并发程序以适时方式执行的能力叫活性。以下部分介绍最常见的一种活性问题,死锁,并简单介绍其他两种活性问题,饥饿和活锁。

死锁

  死锁描述了一种情况:两个或两个以上的线程都被永久封堵,而他们还在相互等待对方释放一个对象的锁。

public class DeadLock {
//嵌套类
static class Friend {
private String name;
public Friend(String name) {
this.name = name;
}
//注意以下两个方法均为同步方法,运行该方法都要请求对应对象的锁
public synchronized String getName() {
return this.name;
}
public synchronized void introduce(Friend he) {
System.out.format( "I'm "+"%s%n", this.name);
System.out.format( "And she is "+"%s%n", he.getName());
}
}
public static void main(String[] args) {
final Friend alphonse = new Friend("Alphonse");
final Friend gaston = new Friend("Gaston");
//使用匿名类创建两个线程,并启动线程
new Thread(new Runnable() {
public void run() { alphonse.introduce(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.introduce(alphonse); }
}).start();
}
}

  运行以上代码,很有可能就会产生死锁,程序无法结束运行,因为两个线程可能同时拥有一个对象的锁(同步方法造成的),同时又想请求对方已拥有的锁,这样就会造成死锁。

  打个比方,甲乙两个人同时想往木板上钉钉子,而工具只有一把锤子和一盒钉子,甲先拿到了锤子,而乙则抢到了钉子,这样就陷入了僵局,即死锁。人可能比较会变通,其中任何一个人让一下,谁都能完成工作,而机器不会,他们严格遵守先拿先用的原则,这样就陷入了无休止的死锁当中,当然以上我说的可能产生死锁,是因为其有一定的概率,可能有一个线程先拿到两个对象的锁,并执行完毕,这样就不会产生死锁。

饥饿

  饥饿和活锁较死锁更为少见,但依然是并发软件设计中可能遇到的问题。

  饥饿是指一个线程需要经常请求一个资源而无法得到满足,因而使其进展缓慢的情况。一个共享的对象资源被一个“贪婪”的线程长期占据,比如该共享对象中有一个同步方法需要长时间才能执行完成,而另外一个线程则需要频繁同步访问该共享对象就会被经常堵塞,饥饿就产生了。

活锁

  如果一个线程的动作响应另外一个线程,而另外一个线程的动作也响应该线程,这样就可能会产生活锁。就像死锁一样,活锁导致线程无法继续运行,然而线程并未被封堵,只是忙于相互响应而无法恢复工作,打个比方,甲乙两人迎面要走过一个走廊,甲向左以避开乙,而乙却向右,这样就又堵住了对方的路,甲乙又同时响应对方。。。没错,还是过不去。

java-并发-活性的更多相关文章

  1. Java并发基础概念

    Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共 ...

  2. Java并发实现线程阻塞原语LockSupport

    LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现.LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. 1.Lock ...

  3. 多线程的通信和同步(Java并发编程的艺术--笔记)

    1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递.   2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ...

  4. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  5. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  6. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  7. 【Java并发编程实战】-----“J.U.C”:CLH队列锁

    在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列.他能够确保无饥饿,严格的先来先服务的公平性.下图是CLH队列节点的示意图: 在CLH队列的节点QN ...

  8. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  9. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  10. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

随机推荐

  1. EBS 11i 的工作流列表

    总帐模块(GL) GIS(Global Intercompany System)通知 GL自动分配 GL成批分配流程 GL分配流程 GL过帐流程 GL经常性日记帐流程 PA分配组流程 日记帐审批 应付 ...

  2. C# DBHelper 第二版

    1. [代码][C#]代码     跳至 [1] [全屏预览] ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  3. JSTL标签库(一)核心标签库

    核心标签库(core) 1.表达式操作 2.流程控制 3.迭代操作 4.URL操作 1.表达式操作 标签 语法 功能 说明 <c:out> <c:out value="&l ...

  4. 微信开发(一)内网映射之natapp的使用

    1.https://natapp.cn/client/lists 从官网下载客户端和注册账号 2.打开文件后退出 当前Ctrl+C 输入natapp -authtoken=xxxxx 此为从我的客户端 ...

  5. 计算机维修之操作系统的安装(windows、Mac、Linux)

    从大学开始接触了更多的计算机知识,我就在开荒一样,慢慢的接触多了,就想着安装操作系统一定要学会. 前前后后呢,我折腾过很多操作系统,在我的笔记本上存在过Windows.黑苹果.Linux.安卓等操作系 ...

  6. 使用CSS隐藏HTML元素的4种常用方法

    现在的网页设计越来越动态化,我们经常需要隐藏某些元素,在特定的时候才显示它们.我们通常可以使用4种方法来隐藏和显示元素. 这4种显示和隐藏元素的技术各自有它们自己的优点的缺点,下面来举例说明. 在这篇 ...

  7. 掌握 tar 命令让你秒变大牛

    导读 相信很多初学者在linux环境下为文件归类整理而犯愁,下面是整理文章的的一些命令与技巧,学习Tar命令将会让你处理文件时更加得心应手. Tar(Tape ARchive,磁带归档的缩写:最初设计 ...

  8. TCP那些事

    本文是<TCP-IP详解.卷1 协议>的读书笔记 1 TCP简介 TCP提供一种可靠的.面向连接的字节流服务.TCP通过下面的方式来保证服务是可靠的: 应用程序被分隔成TCP认为最适合发送 ...

  9. 人工智能 启发式算法(A,A*)

    启发式算法区别于盲目搜索算法,是搜索策略的一种.主要特点是 可以利用问题自身的一些特征信息(启发式信息)来指导搜索的过程,从而可以缩小搜索范围,提高搜索效率. 实际上,启发式算法也代表了"大 ...

  10. js打印对象数组信息

    function writeObj(obj){ var description = ""; for(var i in obj){ var property=obj[i]; desc ...