四、活性
(一) 死锁
一个并发应用的即使执行能力叫做它的活性。这章描述了很多一般类型的活性问题,死锁,然后简单的描述了另两个问题,饥饿和活锁。
死锁就是俩个或多个线程互相等待造成永远被阻塞的状况。这里有一个例子。
Alphonse和Gaston是朋友,并且非常讲礼貌。有礼的一个严苛的准则就是当你向你朋友鞠躬时,你必须保持鞠躬的姿势直到你朋友给你回应一个鞠躬。不幸的是,这个规则在俩个朋友在同一时间鞠躬时不适用。这个例子程序,Deadlock,模拟了这种可能性
public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s"+ " has bowed to me!%n", this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"+ " has bowed back to me!%n",
this.name, bower.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.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}
当Deadlock运行,当2个线程试图调用bowBack时,非常有可能这2个线程会被阻塞。并且阻塞永远不会结束,因为每个线程都在等待其他的线程退出bow。
(二) 饥渴和活锁
饥渴和活锁相比死锁是不那么常见的问题,但是仍然是同步软件开发的每个开发者有可能会遇到的问题。
1. 饥渴
饥渴描述了这样一种状况:一个线程不能够正常访问共享资源造成它不能够前进往下执行。这通常发生在当共享资源因为贪婪的线程长时间不能够被其他线程获得。比如,假如有一个同步方法通常需要很长时间才返回。如果一个线程频繁调用这个方法,其他的线程也需要频繁的同步访问同一个对象,这就会造成阻塞。
2. 活锁
一个线程通常会有一些动作回应其他线程的活动。如果其他线程也会回应另一个线程的活动。这时就会导致活锁的发生。就像死锁,活锁也不能继续向前执行。然而线程并没有被阻塞-它们只是忙于彼此互相回应而不能继续工作。这可以比作有2个人在走廊上试图让彼此都通过:Alphonse移动他的左脚让Gaston通过,同时Gaston移动他的右脚让Alphonse通过。可以看到他们仍然互相阻塞,Alphone移动他右脚的时候,Gaston移动他的左脚。他们仍然互相阻塞,这样…
分享到:
相关推荐
Java并发编程实践是一本深入探讨Java多线程编程的经典书籍,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowbeer和David Holmes以及Doug Lea共同撰写,由Addison-Wesley Professional出版社出版,书号为ISBN ...
第一章 Java 并发编程实践基础..............................................................1 1.1 进程与线程.................................................................................................
- **标准库**:Java并发工具包(java.util.concurrent)提供了丰富的并发工具类。 - **第三方库**:例如Apache Commons Concurrency等。 ##### 2. 构建库 - **自定义并发组件**:根据项目需求开发特定的并发工具。 ...
Java 并发实践提炼 该存储库旨在存储组织在一本流行书籍讨论的想法、概念和问题的正在进行的工作的结果。 基本面 构建并发应用程序 活性、性能和测试 进阶课题 【Java内存模型】(the-java-memory-model.textile)
总的来说,基于Java的WebSocket实现涉及到网络编程、协议解析、多线程以及可能的并发控制等多个方面。理解WebSocket的工作原理和Java API的使用是实现WebSocket服务的关键。在实际开发中,还需要根据具体需求进行...
Java并发编程是多线程环境下保证程序正确性的关键。原子操作类和非阻塞算法是其中的两个核心概念,它们提供了高效、线程安全的解决方案,尤其在高并发场景下表现优越。 首先,原子操作类是Java并发编程的重要工具,...
本示例将探讨如何在Java中实现长连接,并结合心跳检测来保持连接的活性。 首先,让我们了解TCP长连接的概念。TCP是一种面向连接的、可靠的传输协议,它会在数据传输前先建立连接,传输完成后断开连接。然而,对于...
### Java并发编程实践 #### 书籍概述 《Java并发编程实践》是一本深入探讨Java并发机制的专业书籍,由Brian Göetz、Tim Peierls、Joshua Bloch等多位作者共同编写,出版方为Addison-Wesley Professional。本书提供...
Java代码实现这部分功能时,通常会用到Socket编程来处理TCP连接,以及多线程技术来处理并发请求。 在描述中提到的JAVA代码,应该包含了创建CMPP连接、登录验证、发送短信、接收应答和关闭连接等关键步骤。这部分...
### Java并发编程基础 #### 一、引言 在现代软件开发中,多线程编程是提高程序性能和响应性的关键技术之一。随着处理器核心数量的不断增加,利用并发性已成为优化应用性能的重要手段。本篇文章将根据提供的PPT资料...
在Java编程中,心跳包(Heartbeat Packet)是一种在网络通信中维持连接活性的重要机制。它主要用于检测网络连接是否中断,防止因为网络延迟或故障导致的通信异常。本项目实现了心跳包的发送和接收功能,包括客户端和...
在Java编程领域,构建一个实时聊天系统是一项常见的挑战,它涉及到网络编程、多线程、并发处理以及数据传输等多个关键知识点。本篇将深入探讨"Java互联网实时聊天系统源码.zip"所涵盖的技术要点。 1. **Java Socket...