一,并发理论的简介
1.解释java线程模型
java线程模型建立在两个基本的概念之上:
- 共享的,默认可见的可变状态:所有线程都可以很容易地共享同一进程中的对象,能够引用的线程都可以修改这些对象
- 抢占式线程调度:线程调度程序几乎任何时候都能在内核上调入或调出线程(否则无限循环的方法会一种占用CPU)
线程的调度可能会导致方法“半途而费”,并出现状态不一致的对象。某一线程对数据进行修时,会让其他线程无法见到本来应该可见的修改。为了缓解这些风险,Java提出了最后一点要求:
- 为了保护脆弱的数据,对象可以被锁住
2.设计理念
Doug Lea在创造他的里程碑式的作品java.util.concurrent时列出了下面这些最重要的设计原则:
- 安全性:不管同时发生多少操作都能确保对象保证自相一致
- 活跃度:在一个活跃的系统中个,所有做出的尝试的活动最终要么取得进展,要么失败。
- 性能
- 可重用性
3.系统开销之源
- 锁的检测
- 环境切换的次数
- 线程的个数
- 调度
- 内存的局部性:在程序运行中的短时间内,程序访问数据位置的结合限于局部范围内(理解不是很清楚,理解了再来修改博客)
- 算法的设计
二,块结构并发(JAVA 5之前)
1.同步与锁
sychronized的知识就不多说了,不懂的可以网上查查。
Java中的同步和锁相关的一些基本事实:
- 只能锁定对象,不能锁定原始类型(原始类型不是对象)
- 被锁定的对象数组中的单个对象不会被锁定
- 同步方法可以视为包含整个方法的同步(this){.....}
- 静态同步方法会锁定它的class对象
- 内部类的同步是独立于外部类的
- sychronized并不是方法签名的组成部分,所以不能出现在接口方法声明中
- 非同步方法不会查看或关心任何锁的状态,而且同步方法运行时它们任然能够运行
- Java的线程锁是可重入的。也就是说持有锁的线程在遇到同一个锁的同步点(比如一个同步方法调用同一个类的另外一个同步方法)时是可以继续的
2.线程的状态模型
3.解决同步问题的一个办法——完全同步对象
完全同步对象必须满足的所有条件
- 所有field在任何构造方法的初始化都能达到一致的状态
- 没有公共filed
- 从任何非私有方法返回后,都可以保证对象实例处于一致的状态
- 所有方法都可在有限时间内终止
- 所有方法都是同步的
- 当处于非一致状态时,不会调用其它实例的方法,不会调用非私有方法
一个完全同步类的例子:
完全同步类的缺点很明显:锁会把你的速度拖慢,这也是并发处理方式主要的问题
3.Java中确立临界区的关键字为什么是sychronized?而不是"critical"或者是“locked”
以前,程序员可能不容易碰到支持多处理器系统,因此并发编程过去主要考虑如何分享CPU时间(多个线程在单核上轮流上位,相互调换)。如今,多核处理器很普遍,我们应该吧多个线程在同一物理时刻运行在不同处理器上(并且很可能会操作共享的数据)。
被同步的是在不同线程中表示被锁定对象的内存块,也就是说,在sychronized代码块(或者方法)执行完之后,被锁定对象所做的任何修改全部都会在线程释放锁之前刷回到主内存中。当进入一个同步代码块,得到线程锁之后,被锁定对象的任何修改都是从主内存中读出来的,所以在锁定区域代码开始执行之前,持有锁的的线程和锁定对象主内存中的视图同步了
4.关键字volatile
一个volatile域需要遵循如下规则:
- 线程所见的值在使用之前总会从内存中再读出来
- 线程所写的值总会在指令完成之前被刷回到主内存中
程序员可以借此编写简化的代码,但是付出的代价是每次访问都要额外刷一次内存。volatile变量不会引起线程锁,所以使用volatile编程不可能发生死锁。更微妙的是volatile编程式真正线程安全的,但是只有写入时不依赖当前状态的变量才应该声明为volatile变量。对于要关注当前状态的变量,只能借助锁保证其绝对安全性。也可以理解volatile只是为了它的通信效果,而不是为了互斥访问。
以上内容全部来自《Java程序员修炼之道》如果想具体了解,可以看看原书
相关推荐
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
综合来看,该书不仅适合于对Java并发编程感兴趣的初学者,同样也适合有经验的开发者,作为一本参考资料和实践指南,读者可以通过它来加深对Java并发特性的理解和应用。书中丰富的案例分析和代码示例将有助于读者更...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
锁机制是Java并发编程中的另一大主题,包括内置锁(互斥锁)和显式锁(如`ReentrantLock`)。内置锁是`synchronized`关键字提供的,而显式锁提供了更细粒度的控制和更丰富的功能。书中可能还会讨论读写锁(`...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者理解并掌握Java并发编程的核心概念和技术。 在Java并发编程中,首先我们需要了解的基本概念是线程。线程是操作系统分配CPU时间的...
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
#### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中通过实例解释了诸如`...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
#### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念...
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...
"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...
《Java并发实战》是深入探讨Java编程中并发处理的一本技术书籍。在现代软件开发中,多线程和并发控制是提升程序性能的关键技术,尤其是在服务器端开发中尤为重要。Java作为一门成熟的编程语言,其在并发控制方面提供...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...