`
春花秋月何时了
  • 浏览: 39622 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
文章列表
  除了volatile和synchronized可实现可见性之外,final关键字也可以实现可见性(但final域所属的引用不能从构造方法中“逸出”)。synchronized同步块的可见性是由happens-before的锁定规则获得的。下面就来详细的研究一下final关键字的内存语义。   对于 final 变量,编译器和处理器都要遵守两个重排序规则:   写final域规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。         该规则禁止把final域的写操作重排序到构造函数之外,因为执行构造函数 ...
前言 volatile关键字是JVM提供的最轻量级的同步机制,但是由于其不容易被正确地、完整的理解,以至于许多程序员都习惯不去使用它,而总是选择synchronized重量级的锁机制来进行同步,本文将弄清楚volatile关键字的真正语义。 ...
一、前言 通过前面的Java内存模型JMM了解,我们知道多线程程序在执行过程中,不仅存在多个工作内存与主内存之间的内存交互,而且还可能存在指令重排序的情况。这将导致在多线程环境下,线程间操作的可见性变得难以把握。   我们不能就所有场景来规定某个线程的修改何时对其他线程可见,但可以制定某些规则,一旦满足这些规则我们就能轻松的确定线程间操作的可见性,这些规则就是happens-before中文也译为先行发生原则。从JDK 1.5 开始,JMM就使用happens-before的概念来阐述多线程之间的内存可见性。   二、happens-before原则         没错,hap ...
重排序背景          现代计算机的处理器架构几乎都采用流水线机制在一颗处理器内核中实现指令级并行运算(甚至一个CPU拥有多条独立的流水线这称为超标量),简单地理解即是说,将一条指令的执行过程拆分成不同的执行 ...
为了能够深入理解Java并发的原理,以及synchronized、volatile和Lock等内部原理,我们首先需要了解Java内存模型的相关知识。   一、从硬件的效率与一致性开始的硬件内存架构  由于计算机的运算速率和它的存储和通讯子系统速度的差距太大,现代计算机硬件已经从追求处理器频率发展到多核心并发处理的过程。但是计算机的运算任务又不可能只靠处理器以及处理器内的寄存器“计算”就能完成,处理器至少需要与内存进行交互,从而读取运算数据,存储运算结果。由于计算机的存储设备与处理器的运算速度之间有着几个数量级的差距,所以现代计算机不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存 ...
一、Wait/Notify线程通信机制原理 线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了。   Java有 ...
一、线程同步与锁  同步和锁的概念,主要是为了解决多线程共享资源的问题。当多个线程对共享资源进行竞争访问,导致运行结果与期望不符时,通常就需要利用线程同步和锁的机制来消除这种多线程的竞争访问导致的差异性。示例: public class ThreadCompetitionTest { static int count=0; public static void main(String[] args) throws InterruptedException { long start=System.currentTimeMillis(); ...
概念 ThreadLoacl主要是用来做线程间共享但又不关联的共享变量的存储。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,也就是只是共用这个变量以及该变量的初始值,所以每一个线程都可以 ...
  1 线程组概念 Java中提供了线程组类: java.lang.ThreadGroup, ThreadGroup线程组是为了方便管理线程,它可以统一设定线程组中的线程的优先级,或者设置为守护线程,或者为没有设置异常处理器的线程设置统一的异常处理器等等,同时也可以通过线程组方便的获的线程组中的线程的一些信息。   通过查看Thread线程类的构造方法,可以发现在实例化线程对象的时候,可以指定所属的线程组,Thread(ThreadGroup group,...)。如果创建线程的时候没有指定线程组,那么该线程将会默认自动属于创建该线程的线程所在的组,例如在main方法中创建的线程,如 ...
线程生命周期示意图:   线程的状态: 1. 初始状态(New) 当创建了线程对象实例 即 new Thread(...) 之后,线程进入初始状态,注意这个时候,它还仅仅是一个普通的对象实例,而不是真正的线程,JVM也不会分配相应的资源,例如栈内存空间。   2. 可运行状态/就绪状态(Runnable) 调用了start()方法之后,线程位于“可运行线程池”中,变得可运行也即就绪,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。   3. 运行状态(Running) 就绪状态的线程被操作系统选中,获取了CPU时间片,执行程序代码 ...
1 线程中断interrupt 中断机制的实现是通过一个标记中断状态(interrupt status)实现的。我们通过调用某个线程对象的interrupt方法只是来设置这个标记,而并非直接终止线程的运行。当一个线程调用了Thread的静态方法interrupted判断到自己被中断后,立即会将这个状态清空。但是如果调用Thread的实例方法Isinterrupted判断,则不会清空中断状态。总的来说,线程如何支持中断,这依赖于线程的运行时代码是如何编写的。 当使用interrupt方法中断了一个处于阻塞或者正试图执行阻塞操作的线程时,将会抛出一个InterruptedException异 ...
1 创建线程与创建线程运行时代码 在Java中,创建线程的方式只有一种,就是创建Thread对象的实例。创建线程运行时代码有三种方式: 第一种:继承Thread类,覆写其run方法。 第二种:实现Runnable接口,实现run方法,Thread类也实现了Runable接口。
并发模型设定了系统中的并发线程如何协作完成被分配的任务。不同的并发模型存在不同的业务拆分与线程协作方式。   一 并行工作者模型。  在并行工作者模型中,委派者(Delegator)将作业分派给不同的工作者,每个工作者独立完成整个任务作业。工作者大多是以多线程的方式并行运行。 1.1 并行工作者模型的优点 简单易懂,往往只需要增加工作者来提高系统并行处理能力。例如:
一、概念术语 进程:进程通常是程序、应用的同义词。不过,用户所看到的一个单独的应用事实上可能还会有一系列的协作进程(cooperating processes),例如Linux上就可以通过fork创建一个进程副本。最简单的情况下,一个应用就是 ...
在JDK5U9之后,NIO在Linux 内核版本大于2.6的服务器上支持了epoll。其对并发的处理会有大幅度的性能提升,JVM启动参数如下: -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider   在tomcat中启用的办法是在 catalina.sh 的开头加入下面这一行: CATALINA_OPTS='-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider'   Epoll的优点有哪些呢 ...
Global site tag (gtag.js) - Google Analytics