一、synchronized的使用

1.1修饰方法
public synchronized void method()
{
// todo
}
1.2修饰代码块
  public  void run() {
synchronized(this) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
1.3修饰静态方法
public synchronized static void method() {
// todo
}
1.4修饰一个类
class ClassName {
public void method() {
synchronized(ClassName.class) {
// todo
}
}
}

对于普通方法,锁是当前实例对象

对于静态同步方法,锁是当前类的Class对象

对于同步方法快,锁是Synchonized括号里配置的对象

二、对象锁的分析

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常是必须释放锁

锁是怎么实现代码同步的:

这里有个minitor对象,其特点是:在同一时间,只有一个线程/进程能进入monitor所定义的临界区,这使得monitor可以实现互斥的效果,无法进入monitor临界区的进程/线程被阻塞,在适当的时候被唤醒

java对象存储在内存中分为三部分:对象头、实例数据和对齐填充,对象头中存储了锁标识

java对象头分析:

Java对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位

运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储一下4种数据

锁对象基本原理:

当一个线程需要获取Object的锁时,会被放入EntrySet中进行等待,已经获取到锁的线程在缺少谋些外界条件的情况下,可能无法继续进行,那么线程就通过wait()方法将锁释放

进入wait Set区进行等待,当外部条件满足时,先被阻塞的线程就先进去EnterySet区去竞争锁,这个外界条件在monitor机制中被称为条件变量

三、锁的升级

JavaSE1.6中锁一共有四种状态:从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态

偏向锁:

sychronized的实现原理和应用的更多相关文章

  1. 【Java】【JVM】Sychronized底层加锁原理详解

    我们首先先看看JMM模型,话不多说,上图: JMM对应的8大原子操作: read(读取):从主内存读取数据 load(载入):将主内存读取到的数据写入工作内存 use(使用):从工作内存读取数据来计算 ...

  2. Java多线程-基础知识

    一. 进程是执行中的程序,程序是静态的(我们写完以后不运行就一直放在那里),进程是执行中的程序,是动态概念的.一个进程可以有多个线程. 二. 多线程包含两个或两个以上并发运行的部分,把程序中每个这样并 ...

  3. HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  4. Atitit.软件与编程语言中的锁机制原理attilax总结

    Atitit.软件与编程语言中的锁机制原理attilax总结 1. 用途 (Db,业务数据加锁,并发操作加锁.1 2. 锁得类型 排它锁 "互斥锁 共享锁 乐观锁与悲观锁1 2.1. 自旋锁 ...

  5. ArrayList/Vector的原理、线程安全和迭代Fail-Fast

    疑问 * ArrayList是非线程非安全的,具体是指什么?具体会产生什么问题?* ArrayList的内部原理是什么?为什么可以动态扩容?* Vector是线程安全的,具体是如何实现的?为什么不再推 ...

  6. 解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度-美团)

    还有其他的锁,如果想要了解,参考:JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁, 用synchronized实现ReentrantLock 美团面试题参考:使用synchronized ...

  7. (转)HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  8. Dubbo学习笔记6:Dubbo增强SPI与SPI中扩展点自动包装的实现原理

    在Dubbo整体架构分析中介绍了Dubbo中除了Service和Config层为API外,其他各层均为SPI,为SPI意味着下面各层都是组件化可以被替换的,也就是扩展性比较强,这也是Dubbo比较好的 ...

  9. 深入理解多线程(四)—— Moniter的实现原理

    在深入理解多线程(一)——Synchronized的实现原理中介绍过关于Synchronize的实现原理,无论是同步方法还是同步代码块,无论是ACC_SYNCHRONIZED还是monitorente ...

随机推荐

  1. 解析MindMapper选项中的鱼骨选项

    MindMapper思维导图可以画鱼骨图,而且完成的相当漂亮,我们可以在选项设置中定义鱼骨图图的默认样式.下面本文就分析了MindMapper选项中可以更改哪些鱼骨图设置. 我们首先打开MindMap ...

  2. go学习路线资料

    编辑器 JetBrains公司出品的,goland go初步学习路线 Go 指南 如何使用Go编程 实效Go编程 Go by Example 中文版 参考: Go 语言学习资料与社区索引 Go入门指南 ...

  3. web文件上传漏洞

    什么是文件上传漏洞? 指利用系统的对文件上传部分的控制不足或处理缺陷,上传可执行的动态脚本文件/webShell进行攻击行为. 原因 对于上传文件的后缀名(扩展名)没有做较为严格的限制 对于上传文件的 ...

  4. E - Knapsack 2 题解(超大01背包)

    题目链接 题目大意 给你一n(n<=100)个物品,物品价值最大为1e3,物品体积最多为1e9,背包最大为1e9 题目思路 如果按照平常的背包来算那么时间复杂度直接O(1e11) 这个你观察就发 ...

  5. Visual Studio 连接 SQL Server 关键代码

    首先先把Visual Studio 上面工具打开-->连接数据库-->选择Microsoft SQL Server进入(有两种验证方式:1.windows验证方式[就是本机验证]:2.SQ ...

  6. BootstrapBlazor 组件库使用体验---Table篇

    原文地址:https://www.cnblogs.com/ysmc/p/13323242.html Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 Ja ...

  7. Alpha冲刺-第九次冲刺笔记

    Alpha冲刺-冲刺笔记 这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE2 这个作业要求在哪里 https://edu.cnblogs. ...

  8. MAT内存分析工具安装指南(MAT)

    https://blog.csdn.net/mahl1990/article/details/79298616

  9. Cys_Control(三) MTextBox

    一.查看TextBox原样式 通过Blend查看TextBox原有样式 <Window.Resources> <SolidColorBrush x:Key="TextBox ...

  10. Cys_Control(二) MButton

    一.添加自定义Button 二.Xaml文件自动关联 Custom Control 取名与资源文件相同加.cs文件将自动关联 Themes文件下Generic.xaml引入该控件,用于对外公布样式 & ...