Concurrent Basic

2016-11-16  本文已影响28人  huduku

Concurrent Basic

本文引自《Java多线程编程实战指南(设计模式篇)》

基础


无处不在的线程

进程(Process)代表运行中的程序。一个运行的Java程序就是一个进程。

从操作系统地角度来看,线程(Thread)是进程中可独立执行的子任务。一个进程可以包含多个线程。同一个进程中的线程共享该进程所申请到的资源,入内存空间和文件句柄。

从JVM的角度来看,线程是进程中的一个组件(Component),它可以看作执行Java代码的最小单位。Java程序中任何一段代码总是执行在某个确定的线程中。

JVM在启动的时候会创建一个main线程,该线程负责执行Java程序的入口方法(main方法)。

在多线程编程中,弄清楚一段代码具体由哪个(或者哪种)线程去负责执行的这点很重要,这关系到性能问题,线程安全问题等。

Java中的线程可以分为守护线程(Deamon Thread)和用户线程(User Thread)。用户线程会阻止JVM的正常停止,即JVM正常停止前应用程序中的所有用户线程必须先停止完毕。否则JVM无法停止。而守护线程则不会影响JVM的正常停止,即应用程序中所有守护线程在运行也不影响JVM的正常停止。因此守护线程用来做一些重要性不是很高的任务,例如监视其他线程的运行情况。


线程的创建和运行


线程的状态和上下文切换

Thread.State :

从上述描述可知,一个线程在其整个生命周期中,只可能一次处于NEW的状态和TERMINATED状态。而一个线程的状态从RUNNABLE状态转换为BLOCKED、WAITING和TIMED_WAITING这几个状态中的任何一个状态都意味着上下文切换(Context Switch)的产生。

上下文切换 : 对线程上下文信息进行保存和恢复的过程就称之为上下文切换


线程的监视


原子性、内存可见性、指令重排序、synchronized、volatile

synchronized(syncObject) { 
    //critical section
}

synchronizedvolatile的区别:synchronized既能保证操作的原子性,又能保证内存的可见性。而volatile仅能保证内存可见性。但是前者会导致上下文切换,而后者不会。


线程的优势和风险

优势 :

风险 :


常用术语

术语 释义
任务 Task 把线程比作公司员工的,那么任务就可以被看作员工所要完成的工作内容。任务与线程并非一一对应的,通常一个线程可以用来执行多个任务。任务是一个相对的概念。一个文件可以被看作是一个任务,一个文件中的多个记录可以被看作一个任务,多个文件也可以看作一个任务
并发 Concurrent 表示多个任务同一时间段内被执行,这些任务并不是顺序执行的,而往往是以交替的方式被执行
并行 Parallel 表示多个任务在同一时刻被执行
客户端线程 Client Thread 从面向对象编程的角度来看,一个类总是对外提供某些服务(这也是这个类存在的意义)。其它类是通过调用该类的响应方法来使用这些服务的。因此,一个类的方法的调用方代码就被称为该类的客户端代码。相应地,执行客户端代码的线程就被称为客户端线程。因此,客户端线程也是一个相对的概念,某个类的客户端线程随着执行该方法调用方代码的线程的变化而变化
工作者线程 Worker Thread 工作者线程是相对于客户端线程而言的。它表示客户端线程之外的用于特定用途的其他线程
上下文切换 Context Switch 对线程的上下文信息进行保存和恢复的过程就称为上下文切换
显示锁 Explicit Lock 在Java代码中可以使用和控制的锁,即不是编译器和CPU内部使用的锁。包括synchronizedjava.util.concurrent.locks.Lock接口的所有实现类
线程安全 Thread Safe 一段操纵共享数据的代码能够保证在同一时间内被多个线程执行而保持其正确性的,就被称为是线程安全的

———————————————————— 结束 ————————————————————

上一篇 下一篇

猜你喜欢

热点阅读