Synchronize原理
1 普通方法上
2 静态方法上
修饰静态方法内置锁是当前的Class字节码对象
修饰普通方法内置锁是当前类的实例
原理与使用:
从字节码层面解释:
执行同步代码块
monitorenter
synchronized( ){
}
monitorexit
任何对象都可以作为锁,那么锁信息有存在对象的什么地方呢?
存在对象头中
对象头中的信息 Mark Word Class Metadata Address ArrayLength
Mark Word 存储的是哈希值 锁信息 空间利用率很高的
任何对象都可以作为锁,那么锁信息又存在对象的什么地方呢?
存在对象头中
对象头中的信息: Mark Word Class MetaData Address
jdk1.6之后 引入了
偏向锁: 每次获取锁和释放锁会浪费资源。很多情况下,竞争者不是由多个线程,而是由一个线程在使用。

当一个线程进来时候,找对象头查看是否是偏向锁。偏向锁的Mark Word 字段会记录一些信息 :线程id Epoch 对象分代年龄信息 是否是偏向锁 锁标志位
检查锁标志位是否是偏向锁,接着会检查线程的id如果和当前线程id是一致(第一次直接进来)。第二次进来时候 接着运行同步代码块(没有锁的获取和释放)。偏向锁获取时候,没有撤销。等到有竞争时候 才有释放的机制。 场景:只有一个线程访问代码块会大大提高性能。(多个线程会降低性能)
轻量级锁:
首先栈帧:
虚拟机栈里面存储的是一个个栈帧,每个方法执行都会存储一个栈帧。每个方法执行都会执行栈帧的进栈出栈。
复制Mark Word 到虚拟机栈中
竞争成功之后会将锁的标志位改成轻量级锁,然后执行同步体。
其他线程也是复制Mark Word到虚拟机中
修改Mark Word,发现已经被别的线程获得了锁,所以修改不成功。然后不停的修改。直到第一个线程把锁释放了才OK
第一个线程执行完毕,第二个获取锁之后,会升级为重量级锁(普遍意义上的synchronize),线程会阻塞。
轻量级锁用到了自旋概念。好处:多个线程可以同时
关于单例模式结合Synchronize
单例模式与线程安全问题
饿汉式是没有线程安全问题的
懒汉式是有线程安全问题的
缩小同步代码块的范围,只有在创建时候才有写的操作 其他的都是读的操作没有线程安全问题
在会出现线程安全问题地方加一个synchronize,锁当前的代码 包裹起来
这样其实还是有问题的,双重加锁,再来一个验空。
这样视乎是一个没有问题,重排序问题。
有可能先执行下面的 在执行上面的这样的重排序问题(没法演示)
package com.toov5.threadTest;
public class DoubleLock { private static volatile DoubleLock doubleLock; //防止重排序 private DoubleLock(){ }
public static DoubleLock getInstance(){ //比较饿汉模式而言的,如果在这一行加锁,效率势必会比较低 利用同步代码块
//自旋while(true)
if (doubleLock == null){ //判断一下 如果为null时候 这种情况下才会去创建对象
synchronized (DoubleLock.class){ //静态的用 字节码文件
if (doubleLock==null) { //上锁完了之后 可能没有创建完毕 所以要判断一下 但是 重排序时候 可能会导致 对象可能创建多次
//所以加volitile关键字 (单线程是不会产生重排序问题)
doubleLock=new DoubleLock();
}
} }
return doubleLock; //不为空的话 会直接返回呀 多个线程去创建时候 才有有安全塞问题
} public static void main(String[] args) {
DoubleLock doubleLock1 = DoubleLock.getInstance();
DoubleLock doubleLock2 = DoubleLock.getInstance();
System.out.println(doubleLock1==doubleLock2);
} }
Synchronize原理的更多相关文章
- Linux内核同步 - RCU synchronize原理分析
RCU(Read-Copy Update)是Linux内核比较成熟的新型读写锁,具有较高的读写并发性能,常常用在需要互斥的性能关键路径.在kernel中,rcu有tiny rcu和tree rcu两种 ...
- 深入分析Synchronized原理(阿里面试题)
还有一篇 讲解lock的实现原理,参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理以及如何 获取锁AQS算法 (百度-美团) 记得开始学习Java的时候,一遇到多线程 ...
- Linux内核同步机制--转发自蜗窝科技
Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...
- Suspend to RAM和Suspend to Idle分析,以及在HiKey上性能对比【转】
转自:https://www.cnblogs.com/arnoldlu/p/6253665.html 测试环境:AOSP 7.1.1+Kernel 4.4.17 HW:HiKey Ubuntu 14. ...
- java对象详解
java对象及线程详解 内存布局 普通对象布局 数组的内存布局 内部类的内存布局 对象分解 对象头-mark word(8字节) 实例数据 对齐填充(可选) java锁分析 volatile关键字 v ...
- delphi 线程教学第二节:在线程时空中操作界面(UI)
第二节:在线程时空中操作界面(UI) 1.为什么要用 TThread ? TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...
- synchronize 关键字原理
众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象. 同步静态方法,锁的是当前 Class 对象. 同步块,锁的是 () 中的对象 ...
- Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制
本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...
- Delphi:与VCL同步(Synchronize()、用消息来同步)
看本文时,可以同时参考:Delphi中线程类 TThread实现多线程编程(事件.临界区.Synchronize.WaitFor……) 先说一下RTL和VCL RTL(Run-Time library ...
随机推荐
- zookeeper简单操作
接下来主要讲述了通过zookeeper服务器自带的zkCli.sh工具模拟客户端访问和操作zookeeper服务器(包括集群服务器). 当成功启动zookeeper服务后,切换到server1/bin ...
- 转载别人的DLL DEll研究
昨日,编了个DLL和EXE来进行了下测试,exe通过lib静态联编dll,来调用它的导出类,当改变DLL中导出类的结构(eg.成员变量的顺序等),从新发布DLL而不从新联结编译EXE,就会造成错误的执 ...
- iis express worker process已停止工作
以管理员方式运行命令提示符工具,然后执行以下语句 netsh winsock reset 重启电脑
- HDU 5157 Harry and magic string(回文树)
Harry and magic string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- apk获取源码(dex2jar、jd-gui)
1.下载dex2jar.zip,并解压文件 2.下载jd-gui.zip,解压文件 3.解压apk文件,找到其中的classes.dex 4.将classes.dex复制到dex2jar.bat所在目 ...
- Spring容器初始化的时候如何添加一个定时器?
昨天遇到这个问题,在项目启动的时候添加一个定时器隔一段时间扫描有没有定时发送的邮件(当然也可以是你自己的业务逻辑),也在网上找了资料,加上自己的修改,终于成功了.所以来做个记录. 1.ServletC ...
- hdu 3047 Zjnu Stadium 并查集高级应用
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- 海量数据存储之nosql教程(转)
add by zhj: 不错的系列,作者介绍了NoSQL数据库,并重点研究了Memcached和Redis,不知道后续是否还有其它NoSQL数据库的文章 海量数据存储之nosql教程之-01基础理论 ...
- 【我的Android进阶之旅】如何在浏览器上使用Octotree插件树形地展示Github项目代码?
前言 最近有个同事看到我打开Github项目时,浏览器上的展示效果是树形的,于是他问我这个是什么浏览器插件,我告诉他是Octotree插件.现在我就来介绍介绍这款Octotree插件. 效果对比 1. ...
- 汉澳sinox2014没有黑屏,一个能够依靠的安全避风港
首先汉澳sinox2014没有验证server,根本就没办法区分正版和盗版 其次汉澳sinox2014安装也没有系列号cdkey等东西,直接安装无干扰 最后汉澳sinox2014不会有黑屏这样的东西. ...