zoukankan      html  css  js  c++  java
  • sychronized的实现原理和应用

    一、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中锁一共有四种状态:从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态

    偏向锁:

  • 相关阅读:
    洛谷P2444 病毒【AC自动机】
    AC自动机
    洛谷试炼场2-5---字符串处理【字符串】
    洛谷试炼场1-5---简单字符串【字符串】
    poj2185 Milking Grid【KMP】
    poj3630 Phone List【Trie树】
    CH1809匹配统计【KMP】
    打包命令
    django_auth模块
    mongodb-Configuration
  • 原文地址:https://www.cnblogs.com/anyanpeng/p/14155875.html
Copyright © 2011-2022 走看看