Java并发基本概念

线程安全的体现

不可变:对象被构建完后,其外部可见状态永远不会改变
绝对线程安全:不管运行环境如何,调用者都不需要任何额外的同步措施
相对线程安全:Java语言中的大部分线程安全类,或通常意义所说的线程安全。其保证单独的操作是安全的,对于一些特定顺序的连续调用,则需要额外的同步措施
线程兼容:Java语言中的大部分类(ArrayList,HashMap等),对象本身并不是线程安全的,但是可以通过在客户端使用同步措施来保证对象在并发环境下安全使用,
线程对立:无论使用哪种同步措施都不能保证线程安全,例如Thread的suspend resume等

线程安全的实现方法:

互斥同步:是一种悲观的并发策略,多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一个(或者是一些,使用信号量时)线程使用;临界区,互斥量,信号量都是主要的互斥方式:synchronized,ReentrantLock等
非阻塞同步:CAS指令,例如原子类的AtomicInteger.incrementAndGet()
无同步方案:
    可重入代码:不涉及数据共享的代码
    线程本地共享:ThreadLocal

锁优化:

适应性自旋:互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,带来性能并发压力。如果物理机上有一个以上的处理器,能让两个以上的线程同时并行执行,当一个线程请求一个已经被另一个线程所占用的锁时,我们就可以让这个线程不要阻塞,而是选择“稍等一下”,让这个线程执行自旋,不放弃处理器的时间,看看另一个线程是否很快释放锁
锁消除:对于一些代码,虽然要求同步,但是被检测到不可能存在数据共享,则可以对竞争的锁进行优化消除,例如局部变量的StringBuffer对象的多次append操作。
锁粗化:如果一系列的重复操作都对同一个对象频繁的加锁解锁,则可以将加锁同步的范围扩展(粗化)到整个操作序列的外部,例如上面的append(),就是扩展到第一个append()操作之前和最后一个之后,这样只需加锁一次
轻量级锁:没有多线程竞争的前提下,减少传统的重量级锁在使用时对操作系统互斥量产生的性能消耗;其提升性能的依据是,对于绝大部分锁,在整个同步周期内都是不存在竞争的。
偏向锁:(JDK1.6)消除数据在无竞争情况下的同步原语,如果轻量锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量,那偏向锁就是在无竞争的情况下把整个同步都消除掉,连CAS操作都不做

参考:深入理解Java虚拟机:JVM高级特性与最佳实践

时间: 2024-08-26 13:11:45

Java并发基本概念的相关文章

JAVA并发编程>>概念准备

工于其善,必先利器 1.并发和并行的区别 并行:同一时间点执行多个任务(CPU多核或多个CPU同时执行多个任务) 并发:同一时间段内行多个任务(单核同时执行多个任务) 2.同步和异步的区别 同步:执行某个操作,按顺序执行下去,直到结束. 异步:执行某个操作后,立即离开,等到有返回结果时,回来继续执行. 额,感觉这个描述不怎么正式.但是我认为异步执行就是为了充分利用执行某项操作需要耗费大量时间,而异步就是为了利用这个时间,提高程序本身的执行效率. 3.进程和线程区别 进程:并发执行计算机程序的分配

面包屑之java并发二

最近一直在看<java并发编程实践>. 很大收获谈不上,至少见识到了并发世界的广博. 以前对java并发的概念是少之又少,感觉只需要用好synchronized关键字就好. 如今回想,实乃现实版的井中之蛙,狭隘至极. 书大概看完了,梳理下看到的一些点. 关键字 线程安全: 存在线程共享可变对象,则需要考虑线程安全.线程安全的定义:在多线程环境中,能永远保证程序的正确性. 原子性: 在这指的是基于线程的原子性.原子性操作:只能由一个线程单独访问的操作.即在执行该操作时,要么执行完,要么不执行,不

【java并发编程实战】-----线程基本概念

学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习Java并发编程,共同进步,互相指导. 在学习Java并发之前我们需要先理解一些基本的概念:共享.可变.线程安全性.线程同步.原子性.可见性.有序性. 共享和可变 要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问. "共享"就意味着变量可以被多个线程同时访问.我们知道系统中的资

java并发的基本概念和级别

并发的概念: 并发(Concurrency)和并行(Parallelism) 并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的.而并行是真正意义上的“同时执行”.严格意义上来说,并行的多个任务是真实的同时执行,而对于并发来说,这个过程只是交替的,一会儿运行任务A一会儿执行任务B,系统会不停地在两者间切换.但对于外部观察者来说,即使多个任务之间是串行并发的,也会造成多任务间是并行执行的错觉.真实的并行也只可能出现在拥有多个CPU的系统中(比如多核CPU). 临界区 临界区用来表示一种公共

java并发编程基础概念

1.什么是进程和线程 1.1 进程是程序运行资源分配的最小单位 进程是操作系统进行资源分配的最小单位,其中资源包括:CPU.内存空间.磁盘IO等,同一进程中的多个线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 进程是程序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是死的.静态的,进程是活的.动态的.进程可以分为系统进程和用户进程.凡是用于完成操作

Java - 线程基本概念

[java并发编程实战]-----线程基本概念 线程状态图 说明:线程共包括以下5种状态.1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread().2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行.3. 运行状态(Running)

6、Java并发编程:volatile关键字解析

Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以重获生机. volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatil

【J2EE之web应用】java集群概念

在学习web应用进行部署的时候,遇到一个名词java集群,(其实遇到很多名词╭(╯^╰)╮~~~),不懂意思就查一查!在这里做个笔记! 没有什么高深见解,就搞明白几个概念,java集群的特点 ,还有什么时候使用.这几个问题. 基本术语 如果查java集群概念同时又会得到很多术语,最主要的两个概念是:负载均衡和失效转移.字面意思分别是将请求进行分散和失效的方法或事务进行转移. 越来越多的企业关键应用都必须采用集群技术,实现负载均衡(Load Balancing).容错(Fault Toleranc

JAVA并发总结-基础篇

多线程 1. java中有几种方法可以实现一个线程? 继承Thread类,实现Runnable接口创建一个线程的唯一方法是实例化java.lang.Thread类(或其子类),并调用其start()方法 2. 如何停止一个正在运行的线程? 调用ThreadInstanceA.inerrupt()方法,这样当A线程在Thread的sleep,join方法,或者Object的wait方法的时候会直接抛出InerruptedException,捕捉后便可退出. public void shutdown