JAVA多线程基石
^^^^^^^^^^^^^^
- 作者:臭豆腐[trydofor.com]
- 日期:2008-12-17
- 授权:署名-非商业-保持一致 1.0 协议
- 声明:拷贝、分发、呈现和表演本作品,请保留以上全部信息。
0. 文档目录
^^^^^^^^^^
[[<=$INDEX]]
1. 内存模型
^^^^^^^^^^^
主存储器(main memory),保存所有Object,为所有线程共有.
工作存储器(working memory),各线程私有空间.
线程无法直接读写主存储器,必须把必要数据复制(working copy)到工作存储器.
这些操作,由以下3组共6个原子操作(atomic action)组成.
* lock/unlock 对实例进行获得/解除锁定
* read/write 主存储器和工作存贮器的数据读/写
* use/assign 工作存储器和线程的数据读/写
.....................................................................
------------------------------------------------------------> 时间线
^ Object.field -----> use | 线程A
| <---- assign | 存储器A
---|--------|------------------------------|-------|--------
|lock |read |write | unlock 操作
===v========|==============================|=======v========
| Object.field v 主存储器
(共享)
===================================================^========
x can not lock but wait ... | lock
---|-----------------------------------------------|--------
线程B
存储器B
.....................................................................
2. synchronized的作用
^^^^^^^^^^^^^^^^^^^^^
synchronized 是负责线程的共享互斥的.
被其保护的某个东西,需要进行线程同步和内存同步.
以下是常见的synchronized 写法.
======================== java : Synchronized.java ========================
/**
* methodSA 和methodSB 是等价的
*/
synchronized void methodSA(){
// do something
}
void methodSB(){
synchronized(this){
// do something
}
}
/**
* methodSC 和methodSD 是等价的
*/
static synchronized void methodSC(){
// do something
}
static void methodSD(){
synchronized(Synchronized.class){
// do something
}
}
=====================================================================
线程永远在自己的工作存储器上工作,当碰到synchronized 块时,会发生
* 当线程将要进入时,完成2个动作.
1) 把当前工作存储器的数据write到主存储器
2) 把主存储器的数据read到工作存储器
* 当线程将要离开时,完成1个动作.
1) 把当前工作存储器的数据write到主存储器
3. volatile的作用
^^^^^^^^^^^^^^^^^
volatile 不负责线程的共享互斥,而是进行内存同步.
基本类型(primitive type),如char,int 的赋值和引用操作是原子级的.
对象等引用类型(reference type)的赋值和引用也是原子级的.
但是,long,double 的赋值和引用却不是原子级的.
当线程欲引用 volatile 字段的值时,通常会从主存储器拷贝到工作存储器,
相反,当线程赋值给 volatile字段后,通常会从工作存储器反映到主存储器.
4. Object的休息室
^^^^^^^^^^^^^^^
Object是java之源,也是synchronized和volatile保护的对象.
wait/notify/notifyAll是Object的方法,而不是Thread特有的.
休息室(wait set),是为了描述线程而引进的虚拟概念,它既不真实的也不可操作.
但是,所有实例都有这么一个休息室,是所有等待执行的线程的集合.暂停的线程,
永远会呆在休息室中,除非发生以下任一情况.
* 有其他线程以 notify/notifyAll 方法唤醒该线程.
* 有其他线程以 interrupt 方法唤醒该线程.
* wait 方法已经到期.
因此 wait/notify/notifyAll,都是对休息室的操作以调度线程.
---------------------------
排版格式:
http://www.trydofor.com/a9w3-auhome/trydofor/article/2008/1219143718/body.htm
分享到:
相关推荐
总的来说,Java多线程和并发编程是构建高性能、高并发应用程序的基石。掌握其背后的原理和各种并发工具的使用对于解决实际问题具有非常重要的意义。开发者需要深入理解这些概念和技术,才能编写出既快又稳定的Java...
总的来说,理解和掌握Kafka的Java单线程和多线程编程是构建高性能、可扩展的数据处理系统的基石。通过有效的线程管理和优化,我们可以充分利用Kafka的潜力,处理大规模的实时数据流。在实践中,要根据业务场景灵活...
总之,Java多线程设计模式是构建高性能、高并发系统的基石。通过熟练掌握各种模式并合理运用,开发者能够编写出更加健壮、高效的并发代码。这份"java多线程设计模式"的PDF文档,无疑是一份宝贵的参考资料,值得深入...
### Java多线程技巧详解:join方法的精妙运用 #### 概述 在Java编程中,多线程是处理并发任务的关键技术之一,能够显著提升应用程序的性能和响应速度。然而,多线程的引入也带来了同步和数据一致性的问题。在本文...
本文将深入探讨Java多线程设计模式及其源代码,旨在帮助开发者理解和应用这些模式,提升代码的并发性能和可维护性。 1. **生产者消费者模式**:该模式基于`BlockingQueue`,例如`ArrayBlockingQueue`,用于在生产...
了解和熟练掌握Java多线程编程对于开发高效、响应迅速的应用至关重要,这涉及到线程的同步、互斥、死锁以及线程安全等问题,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法的使用,以及`...
Java多线程并发机制是Java编程中的重要组成部分,它允许程序在多个线程间同时执行,从而提升系统性能和响应速度。并发编程是现代软件设计中的基石,尤其是在服务器端应用和分布式系统中,多线程技术是实现高效能、高...
Java 多线程是未来高并发技术的基石,也是基础。多线程是 Java 的经典技术之一。多线程的概念是指一个进程可以包含多个线程,每个线程可以执行不同的任务。多线程的好处是可以提高程序的执行效率和响应速度。 Java ...
在Java编程中,多线程通信是一个至关重要的概念,特别是在设计高效的并发应用程序时。这个"Java线程通信示例源代码"很...多线程通信是并发编程的基石,理解并熟练运用这些技术对于任何Java开发人员来说都是必不可少的。
《狂神多线程+juc》是一份针对Java并发编程深度学习的资源包,主要涵盖了Java多线程基础以及Java并发工具集(JUC)的高级应用。在Java编程中,多线程是提高程序效率、实现并发执行的重要手段,而JUC(Java ...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
Java线程同步调用是多线程编程中的基石,它通过同步方法和同步代码块两种方式,有效地控制了线程之间的交互,防止了多线程环境下常见的并发问题。无论是对于初学者还是有经验的开发者,掌握和熟练应用这些同步机制都...
Java作为一种广泛应用的编程语言,自1995年由Sun Microsystems(现属于Oracle公司)发布以来,已经发展成为一种支持跨平台性、面向对象编程、多线程处理、网络编程等多种特性的强大工具。Java的设计理念之一就是易于...
Java语言在设计之初便内置了线程的概念,使之成为Java多线程编程的基石。本篇知识点将详细解读Java线程的基础知识,包括线程的定义、它在多线程编程中的作用、线程间通信的基本方法、线程的优劣势以及如何在Java中...
本教程主要涵盖五个核心领域:多线程、Swing图形界面、Applet小程序、网络程序设计以及JDBC数据库编程,旨在帮助初学者全面了解并掌握Java在实际应用中的各种技巧。 一、多线程 多线程是Java的重要特性,它允许程序...
Java内置了对多线程编程的支持,允许开发者创建同时执行的多个线程。这对于现代计算环境至关重要,特别是在需要处理并发任务的应用场景中,如Web服务器、数据库管理等。 #### 网络编程 Java提供了丰富的网络通信API...
Java支持多线程编程,这使得程序能够同时处理多个任务。线程同步和通信是Java并发编程的关键,包括锁(synchronized关键字)、死锁、活锁、阻塞队列等概念。掌握这些,可以编写出高效、稳定的并发程序。 Java集合...