java并发编程笔记(四)--安全发布对象 发布对象 使一个对象能够被当前范围之外的代码所使用 对象逸出 一种错误的发布.当一个对象还没构造完成时,就使它被其他线程所见 不安全的发布对象 某一个类的构造方法为公共的. 如: public class UnsafePublish { private String[] states = {"a", "b", "c"}; public String[] getStates() { return stat…
JVM内存结构与Java内存模型经常会混淆在一起,本文将对Java内存模型进行详细说明,并解释Java内存模型在线程通信方面起到的作用. 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存模式是一种虚拟机规范. JVM内存结构 大家对上图应该非常熟悉了,这就是Java虚拟机的内存结构,Java程序启动后,会初始化这些内存的数据. Java内存模型(JMM) Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问…
在上一章我们从宏观上介绍了ThreadPoolExecutor,本文将深入解析一下线程池的具体实现原理 原理解析 线程池状态 在ThreadPoolExecutor中定义了一个volatile变量,另外定义了几个static final变量表示线程池的各个状态: volatile int runState; static final int RUNNING = 0; static final int SHUTDOWN = 1; static final int STOP = 2; static…
线程的状态 初始态:NEW 创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态. 运行态:RUNNABLE 在Java中,运行态包括就绪态 和 运行态. 就绪态 该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行. 所有就绪态的线程存放在就绪队列中. 运行态 获得CPU执行权,正在执行的线程. 由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态的线程. 阻塞态 当一条正在执行的线程请求某一资源失败时,就会进入阻塞态. 而在J…
1.共享内存和消息传递 线程之间的通信机制有两种:共享内存和消息传递:在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信. 同步是指程序用于控制不同线程之间操作发生相对顺序的机制.在共享内存并发模型里,同步是显式进行的.工程师必须显式指定某个方法或某段代码需要在线程之间互斥执行.在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行…
互斥锁(下):如何用一把锁保护多个资源?    一把锁可以保护多个资源,但是不能用多把锁来保护一个资源. 那如何保护多个资源? 当我们要保护多个资源时,首先要区分这些资源是否存在关联关系. 如下代码 1 class Account { 2 // 锁:保护账户余额 3 private final Object balLock = new Object(); 4 // 账户余额 5 private Integer balance; 6 // 锁:保护账户密码 7 private final Obje…
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17288243 加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性.我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且还希望确保当一个线程修改了对象状态后,其他线程能够看到该变化.而线程的同步恰恰也能够实现这一点. 置锁可以用于确保某个线程以一种可预测的方式来查看另一个线程的执行结果.为了确保所有的线程都能看到共…
  1. start 和 run 方法解释: 1) start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止.2) run: run()方法只是类的一个普通方法而已,如果直接调用R…
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行.具体看代码: public class JoinTest { public static void main(String [] args) throws InterruptedException { ThreadJoinTest t1 = new ThreadJoinTes…
1.队列的概念 谈到多线程先讲下队列的概念,之后的多线程学习会用到此类知识. 队列分为:阻塞式队列(有界).非阻塞式队列(无界),遵循着先进先出.后进后出的原则.阻塞队列与非阻塞队列区别: 1.非阻塞式队列超出队列总数会丢失. 2.阻塞式队列超出总数会进入等待(等待时间=设置超时时间). 3.获取队列方面:非阻塞式队列,如果为空返回null.阻塞式队列,如果为空也会进入等待. 非阻塞式队列ConcurrentLinkedDeque //非阻塞式队列 无界(可以声明无限个队列) public st…