JVM&并发

synchonrized和lock的区别

synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。是原生语法层面的互斥锁。

lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。是API层面的互斥锁。

ReentrantLock相对于synchronized更灵活更强大,增加了轮询、超时、中断等高级功能。

ReentrantLock的实现

ReentrantLock实现Lock接口,包含一个内部类Sync,Sync继承自AQS(AbstractQueuedSynchronizer),一个用来构建锁和同步工具的框架。Sync有两个子类,FairSync和NonfairSync,即公平锁和非公平锁。AQS中有个volatile类型的int state变量,用来记录锁被获取的次数(可重入锁可以多次获取锁,一次只能有一个线程获取锁),默认以非公平方式获取锁,并尝试以CAS方式更新state为1(compareAndSetState(0, 1)),更新成功表明成功获取锁,将此线程记录为独占锁的线程;更新失败则调用acquire(1)方法获取锁(同样采用CAS方式更新state),如果没有成功获取到锁,则调用interrupt()方法中断当前线程。

什么是CAS?

CAS(Compare and Swap),通过JNI(Java Native Interface)调用CPU的CAS指令来完成原子更新操作。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论V值是否等于A值,都将返回V的原值。

乐观锁、悲观锁,什么情况向用乐观锁,什么情况下用悲观锁?

volatile关键字的作用

处理器为了提高处理速度,不会频繁和内存进行通讯,而是先将内存数据读到内部缓存后再进行操作。如果对声明了volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存,但是其他处理器缓存的值还是旧的,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址内容被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。volatile变量的另一个作用是禁止指令重排序,即在汇编代码中插入内存屏障指令来保证处理器不会乱序执行代码(volatile变量前的代码不会排序到变量之后执行)。

Java内存模型中volatile类型变量通过happens-before原则保证写线程对变量的写操作对读线程对变量的读操作时可见的。

Java内存模型

Java阻塞队列

阻塞队列:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。典型的应用是生产者消费者模式。 jdk使用通知模式实现阻塞队列,当生产者线程向满队列中添加元素时会被阻塞,调用await()方法,当消费者线程移除了队列中的一个元素后,会通知生产者线程,调用signal()方法。BlockingQueue的put(e)和take()方法是阻塞的。

GC的过程,GC对程序有什么影响?当发现虚拟机频繁GC时应该怎么办?

JVM&并发

时间: 2024-10-11 21:29:10

JVM&并发的相关文章

JVM并发机制的探讨——内存模型、内存可见性和指令重排序

[转]http://my.oschina.net/chihz/blog/58035 文章写的非常好,为作者点赞. JAVA内存模型 对于我们平时开发的业务应用来说,内存应该是访问速度最快的存储设备,对于频繁访问的数据,我们总是习惯把它们放到内存缓存中,有句话不是说么,缓存就像是清凉油,哪里有问题就抹一抹.但是CPU的运算速度比起内存的访问速度还要快几个量级,为了平衡这个差距,于是就专门为CPU引入了高速缓存,频繁使用的数据放到高速缓存当中,CPU在使用这些数据进行运算的时候就不必再去访问内存.但

JVM 并发性: Java 和 Scala 并发性基础

处理器速度数十年来一直持续快速发展,并在世纪交替之际走到了终点.从那时起,处理器制造商更多地是通过增加核心来提高芯片性能,而不再通过增加时钟速率来提高芯片性能.多核系统现在成为了从手机到企业服务器等所有设备的标准,而这种趋势可能继续并有所加速.开发人员越来越需要在他们的应用程序代码中支持多个核心,这样才能满足性能需求. 在本系列文章中,您将了解一些针对 Java 和 Scala 语言的并发编程的新方法,包括 Java 如何将 Scala 和其他基于 JVM 的语言中已经探索出来的理念结合在一起.

2019年BAT面试通关宝典:数据结构+JVM+并发编程+分布式...

前言 金三银四俗称跳槽黄金季,很多同学都想趁着这段时间拿高薪,去更牛逼的公司工作,认识更多大牛,提升自己的职场竞争力. 那怎样才能通过BAT面试官的考核?怎样成为一名Offer收割机? 收割Offer有一个最直接的公示:Offer=硬实力+软实力+好的心态,三者缺一不可. 一.硬实力 这里说的硬实力,也就是技术上的真实积累. 怎么来体现你的技术实力?总的分为:技术深度和技术广度这两方面. 技术广度通俗的讲,就是你熟悉该技术点的使用以及基本原理.一般面试官在面试首轮会问很多技术点,来考核你是否能正

「Java岗」阿里150道面试题:JVM+并发+SpringBoot+Netty+Redis等

前言在过2个月即将进入9月了,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的java开发朋友跳槽面试,无论一面还是二面,都开始考验一个Java程序员的技术功底和基础.对源码解读和核心原理理解也是成了加分项,特别是对 Java 的一些核心基础知识点掌握的不够或者没有体系方向的朋友面试也成了一个苦恼的事情. 今天在这分享目前国内公司Java面试常问的问题包括JVM,并发编程和数据结构,分布式,SpringBoot,Netty,Redis缓存等.正所谓知己知彼,只

JVM 并发性: 阻塞还是不阻塞?

在任何并发性应用程序中,异步事件处理都至关重要.事件来源可能是不同的计算任务.I/O 操作或与外部系统的交互.无论来源是什么,应用程序代码都必须跟踪事件,协调为响应事件而采取的操作.Java 应用程序可采用两种基本的异步事件处理方法:该应用程序有一个协调线程等待事件,然后采取操作,或者事件可在完成时直接执行某项操作(通常采取执行应用程序所提供的代码的方式).让线程等待事件的方法被称为阻塞 方法.让事件执行操作.线程无需显式等待事件的方法被称为非阻塞 方法. 旧的 java.util.concur

JVM并发分配内存解决方案

1:对进行分配内存的动作进行同步处理-实际上虚拟机采用CAS配上失败重试的方式保证更新操作的原子性. 2:把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程预先在JAVA堆中预先分配一小块内存,称为本地线程分配缓存(TLAB). 哪个线程要分配内存,就在哪个线程的TLAB上进行分配.只有在TLAB用完并分配新的TLAB时,才需要加同步锁.虚拟机是否使用TLAB,可以通 过参数-XX:+/UseTLAB参数来设定. 3:直接在栈上分配,如果对象没有发生逃逸,那么对象将不会再堆上分配.对象

Java 并发编程基础导航

一.中断模型:http://ifeve.com/java-interrupt-mechanism/ 1. 协作制度, 你要我中断,只是给我一个信号,我啥时候中断,是我的事情. 比如 T1调用T2.interrupt(),    T2 如果没有写  if (Thread.intterrupted()) { return or do something}或者 if ( Thread.isintterupted()) { return or do something}  T2鸟都不鸟T1 而且 如果T

JVM 内部运行线程介绍

线程 所属 说明 Attach Listener JVM           Attach Listener线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者.通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version.jmap.jstack等等.如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动. Signal Dispatcher JVM         前面我们提到第一个Attach Listener线程的职

jvm内部现成运行

hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来进行分析.  stack 里面线程非常多,排查起来需要一定的经验,所以,对它们有一定了解,可以提高排查问题的效率.  现在网上资料也不是特别全,所以,导致很多新人在拿到一个stack文件之后,也不知知道从何看起. 下面我把这次整理的一些个人认为比较常见的线程列出来. 线程 所属 说明 Attach