[JAVA修炼之路十]-JVM synchronized原理或优化

synchronized语法:1、synchronized语句;2、synchronized方法

1、monitorenter和monitorexit字节码;依赖于底层的操作系统的Mutex
Lock来实现的

2、会被翻译成普通的方法调用和返回指令如:invokevirtual、areturn指令

原理:用户线程阻塞,内核线程启动,设计到用户线成与内核线程的切换,花销较大

JVM 对于锁的优化

一、偏向锁(Biased
Locking)

jdk1.6之后默认开启。参数开启方式:-XX:+UseBiasedLocking,启动默认五秒之后生效。可以立即生效:-XX:BiasedLockingStartupDelay=0

注意:此锁是JVM内部锁,不是应用锁。所以如果优化会对整个应用产生影响,需要慎重。

在竞争激烈的场合没有太强的优化效果,反而有可能降低性能。

原理:1、锁对象中有markword标志位,当前线程、锁的状态

|当前线程|锁的时间戳|年龄|锁的标示位|是否锁定

好处:在竞争不激烈的环境,并且同一个线程多次请求的时候,完全可以采用synchionrized来实现,代码简介,维护方便。其实就是少了同步

例如:70%以上的请求都可能设计不到锁竞争

坏处:在竞争激烈的环境,此锁完全没有开发的其他锁性能高

实例:

public class Baised {

//内部使用了同步锁

public static List<Integer> numberList=new Vector<Integer>();

public static void main(String[] args) {

long begin=System.currentTimeMillis();

int count=0;

int startnum=0;

while (count<10000000) {

numberList.add(startnum);

startnum+=2;

count++;

}

long end=System.currentTimeMillis();

System.out.println("time-->"+(end-begin));

}

}

jvm参数:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -Xmx512m -Xms512m

需要时间:time-->345

jvm参数:-XX:-UseBiasedLocking -Xmx512m -Xms512m

需要时间:time-->542

二、轻量级锁(Lightweight
Locking)

当线程进入轻量锁之后,会赋值markword到自己的线程栈中。利用cas替换赋值,加锁,如果失败进入膨胀锁。

三、锁膨胀

进入膨胀锁,会调用系统mutex进入重量锁,有可能挂起。内核线程切换,花费较大

四、适应性自选锁(Adaptive
Spinning)

进入自选之后,在临界区争取一定自选次数。自旋次数1.7之后,jvm自行优化。

五、锁消除(Lock
Elimination)

在jit编译时,通过上下文扫描,去掉不可能存在共享资源竞争的锁。因此来提高性能。

例子:

public
class LockEliminate {

private static final int CIRCLE = 2000000;

public static void  main(String args[]) {

long begin=System.currentTimeMillis();

for(int i=0;i<CIRCLE;i++){

createStringBuffer("JVM", "LockEliminate");

}

long end=System.currentTimeMillis();

System.out.println("time-->"+(end-begin));

}

public static String createStringBuffer(String s1,String s2){

StringBuffer sb=new StringBuffer();

sb.append(s1);

sb.append(s2);

return sb.toString();

}

}

JVM
参数:-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks

time-->127

JVM 参数:-server -XX:+DoEscapeAnalysis -XX:-EliminateLocks

time-->269

针对markword参考

时间: 2024-10-02 23:15:35

[JAVA修炼之路十]-JVM synchronized原理或优化的相关文章

深入java虚拟机阅读笔记(jvm内存原理、异常处理部分)

深入理解Java虚拟机:JVM高级特性与最佳实践 阅读笔记(内存原理.异常处理): 1.     Jvm运行时,内存划分如图所示: 2.     程序计数器: Jvm将这个计数看作当前线程执行某条字节码的行数,会根据计数器的值来选取需要执行的操作语句.这个属于线程私有,不可共享,如果共享会导致计数混乱,无法准确的执行当前线程需要执行的语句. 该区域不会出现任何OutOfMemoryError的情况. 3.     虚拟机栈 经常说到的栈内存就是指虚拟机栈.Java中每一个方法从调用直至执行完成的

Java修炼之路——读取XML文件

这次来跟记录下java下如何操作xml文件.其实用过python去爬虫的话,那么应该很容易上手.java中有一个库dom4j就跟python中的lxml类似. 这里要重点强调下,在使用dom4j库的时候,其实它还有一个依赖包,就是jaxen.不添加的可是会报错的.(dom4j和jaxen的下载链接都整理好了在底部) 这里主要就是讲讲怎么用dom4j来读取的xml文件(可以直接从网络上加载,或者本地) //这个是官网上copy的,直接从加载文件 public class Foo { public

Java修炼之路——Junit利器

JUnit超超超级初级入门案例 直接上代码演示: 比方说你现在写了一个ArrayList类的方法: public class ArrayList implements List { private int size = 0; private Object[] elementData = new Object[100]; public void add(Object o){ } public void add(int index, Object o){ } public Object get(in

JVM 内部原理系列

JVM 内部原理(一)- 概述 JVM 内部原理(二)- 基本概念之字节码 JVM 内部原理(三)- 基本概念之类文件格式 JVM 内部原理(四)- 基本概念之 JVM 结构 JVM 内部原理(五)- 基本概念之 Java 虚拟机官方规范文档,第 7 版 JVM 内部原理(六)- Java 字节码基础之一 JVM 内部原理(七)- Java 字节码基础之二 原文地址:https://www.cnblogs.com/kaleidoscope/p/9792619.html

【Java并发编程】11.P6的offer擦肩而过就因为我不懂synchronized原理

使用 synchronized关键字是并发编程中线程同步的常用手段之一,synchronized是悲观锁,其作用有三个: 互斥性:确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须排队获得锁,可见性:保证共享变量的修改能够及时可见,获得锁的线程操作完毕后会将所数据刷新到共享内存区有序性:有效解决重排序问题,其用法也有三个:修饰实例方法修饰静态方法修饰代码块1. 修饰实例方法 synchronized关键词作用在方法的前面,用来锁定方法,其实默认锁定的是this对象. publ

java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递

1.首先客户端需要引入 jquery-1.11.1.js 2.其次javaweb工程里面需要引入jar包  [commons-beanutils-1.8.0.jar.commons-collections-3.1.jar.commons-lang-2.4.jar.commons-logging-1.1.3.jar.ezmorph-1.0.6.jar.json-lib-2.3-jdk15.jar] 3.客户端js端代码 4.servlet 服务器,映射的路径CardColl 以上就是整个过程,如果

Java 详解 JVM 工作原理和流程

作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应用程序接口(JavaAPI).它们的关系如下图所示: 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执

Java虚拟机A博娱乐(JVM)以及跨平台原理

A博娱乐相信大家已经了解到Java具有跨平台的特性,可以"一次编译,到处运行",在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM). JVM也是一个软件,不同的平台有不同的版本.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件.Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行.也就是说,

java Jvm工作原理学习笔记

一.         JVM的生命周期 1.       JVM实例对应了一个独立运行的java程序它是进程级别 a)     启动.启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点 b)     运行.main()作为该程序初始线程的起点,任何其他线程均由该线程启动.JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己