• 技术文章 >Java >java教程

    Java中synchronized关键字的用法介绍(代码示例)

    不言不言2019-01-30 11:21:01转载1589

    本篇文章给大家带来的内容是关于Java中synchronized关键字的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇介绍synchronized关键字的使用方式,区别和偏向锁、轻量锁和重量锁实现原理。

    先看看synchronized关键字的4种用法。

    1、修饰普通方法

    private synchronized void synMethod(){
    }

    这种用法中,synchronized锁的对象实例。

    2、修饰静态方法

    private static synchronized void synMethod(){
    }

    synchronized在这种情况下,锁的是当前Class类对象。

    3、同步方法块

    private  void synMethod1(){
            synchronized(this){
                
            }
        }    
        private  void synMethod2(){
            synchronized(ThreadTest.class){
                
            }
        }

    synMethod1中锁对象实例;synMethod2的是当前Class类对象。

    再介绍锁原理

    在介绍锁原理之前,先认识一下Java对象头Mark Word,以32位为例。

    锁状态

    25 bit

    4bit

    1bit

    2bit

     

    23bit

    2bit

    是否偏向锁

    锁标志位

    轻量级锁

    指向栈中锁记录的指针

    0

    重量级锁

    指向互斥量(重量级锁)的指针

    10

    GC标记

    11

    偏向锁

    线程ID

    Epoch

    对象分代年龄

    1

    01

    无锁

    对象的hashCode

    对象分代年龄

    0

    01

    上面的表格中,描述的是对象在每个锁状态时,对象头中所存储的信息。

    1、偏向锁

    实际环境中,线程在访问同步块时,如果没有其他线程对锁进行竞争,并且由同一个线程多次获得锁,也就是单线程运行同步代码,在这种情况下,若是每次还阻塞线程,就代表白白浪费CPU性能。这种情况下,引入了偏向锁概念。

      可以使用-XX:-userBiasedLocking=false来关闭JVM偏向锁优化,默认直接进入轻量锁。

    2、轻量锁

     

    3、重量锁

    重量锁是基于对象监视器(Monitor)来实现的。

    线程在执行同步代码时,需要调用一个Monitor.enter指令。执行退出后,调用Monitor.exit指令。这里看得出,监视器具有排它性,一个时间点只能有一个线程enter成功,其他线程只能阻塞在队列中。所以这种重量锁的操作成本很高。

    以上就是Java中synchronized关键字的用法介绍(代码示例)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:博客园,如有侵犯,请联系admin@php.cn删除
    专题推荐:synchronized
    上一篇:spring boot集成JSP的方法介绍(代码示例) 下一篇:java多线程的代码示例
    大前端线上培训班

    相关文章推荐

    • 在singleton中对synchronized的使用• java synchronized详解• Java中Synchronized的用法• Java同步锁(synchronized)的示例代码分享• 什么是synchronized?如何使用synchronized?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网