Java多线程编程实战指南读书笔记四

java运行时存储空间Java运行时空间可以非位堆空间,栈空间和非堆空间**。其中堆空间和非堆空间时被多个线程共享的**,而栈空间则是线程的私有空间。每个线程都有自己私有的栈空间。栈空间时为线程的执行而准备的一段固定大小的内存空间,栈空间时线程创建的时候非配的。线程的方法调用是利用栈帧。局部变量的变量之存储在栈空间中,基础类型变量和引用的类型的变量的变量值都是直接存储在栈帧中的。由于一个线程无法访问另一个线程的栈空间,所以线程堆局部变量以及对只能通过当前线程的局部变量才能访问的对象进行操作具有固有的线程安全性堆空间用于存储对象,它也时垃圾回收器工作的场所,即堆空间中没有可达引用的对象会被回收。非堆空间用于存储常量以及类的元数据等,它是Java虚拟机系统的时候分配的一段可以动态扩容的内存空间。类的元数据包括类的静态变量、类有哪些方法以及这些方法的元数据(包括名称,参数和返回值等)

Java多线程编程实战指南读书笔记三

线程数设置的原则 对于CPU密集型线程,考虑到这些线程执行任务值消耗的主要是处理器资源,我们可以将线程数设置为$N_{cpu}$,有事也可以设置为$N_{cpu}+1$ 对于I/O密集型线程,考虑到I/O操作可能导致上下文切换,为这样的线程设置过多的线程数会导致过多的额外系统开销,如果一个工作线程能够满足旧不需要设置更多的线程,如果一个工作者线程不够用,我们可以考虑将这类线程的数量设置为$2*N_{cpu}$ 等待与通知:wait/notify一个线程因为执行目标动作所需的保护条件未满足而被暂停的过程就被称为等待,一个线程更新了系统的状态,使得其它线程所需要的保护条件得以满足的时候唤醒那些被暂停的线程的过程被称为通知。 wait/notify的作用与用法Java平台中Object.wait()/Object.wait(long)和Object.notify()/Object.notifyAll()可用于实现等待和通知。

Java多线程编程实战指南读书笔记二

线程同步机制线程同步机制一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同目标。广义上讲,Java提供的线程同步机制包括,锁、volatile关键字、final关键字、static关键字以及一些相关的API。 锁线程安全产生的前提是多个线程并发访问共享变量、共享资源。使用锁保障线程安全的思路是将多个线程对共享数据的并发访问转换为串行访问。 使用锁保障线程安全的原理:一个线程在访问共享数据之前需要请求获得相应锁(锁的获得),一个锁同一时间只能被一个线程持有。只有持有锁的线程才能访问共享变量。在线程持有锁之后到释放锁这段时间所执行的代码被称为临界区。因此,共享数据只允许在临界区内进行访问,临界区一次只能被一个线程执行。 锁的性质:锁具有排他性,即一个锁一次只能被一个线程持有。因此这种锁被称为排他锁或者互斥锁。 锁的划分: 内部锁:通过synchronized关键字实现的 显式锁:通过java.concurrent.locks.Lock接口实现的。

Java多线程编程实战指南读书笔记一

进程、线程与任务什么是进程进程是程序运行的实例。运行一个java程序的实质是启动一个Java虚拟机进程,也就是说一个运行的Java程序就是一个Java虚拟机进程。进程是程序向操作系统申请资源的基本单位。 什么是线程线程是进程中可以独立执行的最小单位。一个进程可以包含多个线程。同一个进程中的所有线程共享该进程中的资源。 什么是任务线程所要完成的计算就被称为任务,特定的线程总是在执行着特定的任务。 Java线程API简介Thread类或其子类的一个实例就是一个线程。 线程的创建、启动和运行运行一个线程实际上就是让虚拟机运行该线程的run方法,从而使相应的线程任务处理逻辑代码得以执行。我们可以使用Thread类的start方法启动线程。当这个线程何时能够运行是由线程调度器决定的。因此调用了start方法,并不代表线程就立刻运行了。 以下是创建线程的几种方法:

java并发编程学习笔记二

编写正确的并发程序的关键在于共享对象、可变的状态进行访问管理 锁与可见性内置锁可以用来确保一个线程以某种可预见的方式看到另一个线程的影响。锁不仅仅是关于同步与互斥的,也是关于内存可见的。为了保证所有线程都能够看到共享的,可变变量的最新值,读取和写入线程必须使用公共的锁进行同步。 1234567891011@ThreadSafepublic class SynchronziedInteger{ private int value; public synchronized int get(){ return value; } public synchronized void set(int value){ this.value=value; }} 最低限安全性当一个线程在没有同步的情况下读取变量,它可能会得到一个过期值。但它至少可以看到某个线程在那里设定的一个真实数值,而不是一个凭空而来的值。这样的保证称为最低限的安全性。 volatile 变量它可以确保对一个变量的更新以可预见的方式告知其它的线程。当一个域被声明为volatile类型后,编译器运行时会监视这个变量,它是共享的,而且对它的操作不会与其它内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其它处理器隐藏的地方。所以读一个volatile变量时,总会返回某一线程所写入的最新值。 当一个共享变量声明为volatile后:1.当写一个volatile变量时,JMM会把该线程对应的本地内存种的变量强制刷新到主内存中去。2.这个写操作会导致其它线程中的缓存无效。3.volatile会禁止语义重排序。

java并发编程实践学习笔记一

介绍在早期的分时共享系统中,每个进程都是一个虚拟的冯诺依曼机。他们拥有一个内存空间,存储着指令和数据,根据机器语言的语义来顺序的执行指令。线程允许程序控制流的多重分支同时存在于一个进程中,他们共享进程范围内的资源。线程有些时候也被称为轻量级进程。并且大多数现代操作系统把线程作为时序调度的基本单元。 线程的优点线程能通过把异步的工作流程转化为普遍存在的顺序流程,使得程序更容易读写和维护。在多处理器的硬件环境中,使用多线程可以更加有效的使用硬件的资源。 线程的风险在没有充分同步的情况下,多线程中的各种操作的顺序是不可预测的。常见的并发危险还有竞争条件。因为线程共享相同的内存地址空间,并发的运行,他们可能访问或修改其它的线程正在使用的变量。在缺少同步的时候,编译器,硬件和运行时事实上对时间和活动顺序是很随意的,比如在寄存器或高速缓冲中的存储变量,这样会使得他们对于其它线程暂时不可见的。它能提高性能,但是给开发带来了困难。活跃度失败的风险,当一个活动进入某种它永远无法继续再执行的状态时,活跃度失败就会发生了。活跃度失败有多种形式,如死锁(deadlock)、饥饿(starvation)、活锁(livelock)。多线程程序还存在性能危险。 线程安全无论何时,只要有多于一个的线程访问给定的状态变量,而且其中某个线程会写入该变量,此时必须使用同步来协调线程对该变量的访问。 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步以及在调用方代码不必作其它的协调,这个类的行为仍然时正确的,那么称这个类时线程安全的。 对线程安全类的实例进行顺序或并发的一系列操作,都不会导致实例处于无效状态。无状态对象永远是线程安全的。