• Java并发系列之Synchronized


      每一个刚接触多线程并发编程的同学,当被问到,如果多个线程同时访问一段代码,发生并发的时候,应该怎么处理?

      我相信闪现在脑海中的第一个解决方案就是用synchronized,用锁,让这段代码同一时间只能被一个线程执行。
    我们也知道,synchronized关键字可以用在方法上,也可以用在代码块上,如果要使用synchronized,我们一般就会如下使用:

    public synchronized void doSomething() {
        //do something here
    }

    或:

    synchonized(LockObject) {
        //do something here
    }

      那么实际上,synchronized关键字到底是怎么加锁的?锁又长什么样子的呢?关于锁,还有一些什么样的概念需要我们去认识,去学习,去理解的呢?

      以前在学习synchronized的时候,就有文章说, synchronized是一个很重的操作,开销很大,不要轻易使用,我们接受了这样的观点,但是为什么说是重的操作呢,为什么开销就大呢?

      到Java1.6之后,Java的开发人员又针对锁机制实现了一些优化,又有文章告诉我们现在经过优化后,使用synchronized并没有什么太大的问题了,那这又是因为什么原因呢?到底是做了什么优化?

      那今天我们就尝试着从锁机制实现的角度,来讲述一下synchronized在Java虚拟机上面的适应场景是怎么样的。

      由于Java在1.6之后,引入了一些优化的方案,所以我们讲述synchronized,也会基于Java1.6之后的版本。

    锁对象

      首先,我们要知道锁其实就是一个对象,Java中每一个对象都能够作为锁。

      所以我们在使用synchronized的时候, 
      1. 对于同步代码块,就得指定锁对象。 
      2. 对于修饰方法的synchronized,默认的锁对象就是当前方法的对象。 
      3. 对于修饰静态方法的synchronized,其锁对象就是此方法所对应的类Class对象

      我们知道,所谓的对象,无非也就是内存上的一段地址,上面存放着对应的数据,那么我们就要想,作为锁,它跟其它的对象有什么不一样呢?怎么知道这个对象就是锁呢?怎么知道它跟哪个线程关联呢?它又怎么能够控制线程对于同步代码块的访问呢?

    视频地址

    https://www.imooc.com/learn/1086

    课程代码地址:

    https://gitee.com/ZhangShunHai/lanqiaobei/tree/master/src/synchronizedTest

    课程笔记:

      

  • 相关阅读:
    Linux 下IOport编程訪问
    Xcode下执行HelloWorld
    PHP/HTML混写的四种方式总结
    php取两位小数的几种方法
    使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问)
    js进阶 9-7 自动计算商品价值
    html5--1.12表格详解
    html5常用标签table表格布局
    html常用属性border-radius、linear-gradient怎么使用
    类选择器选择非唯一属性无法精确取值的问题
  • 原文地址:https://www.cnblogs.com/zsh-blogs/p/10461606.html
Copyright © 2020-2023  润新知