【Java并发编程】面试如果还没法说透Synchronized底层原理,你就out了!

作者:微信小助手

发布时间:2019-04-21T23:16:56

还没关注?伸出中指点这里!


聊技术、论职场!
为IT人打造一个“有温度”的狸猫技术窝

来源:http://h5ip.cn/meHz


一、Synchronized的基本使用

二、Synchronized的底层原理

三、运行结果解释

四、总结


一、Synchronized的基本使用

Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。


Synchronized的作用主要有三个:

  1. 确保线程互斥的访问同步代码

  2. 保证共享变量的修改能够及时可见

  3. 有效解决重排序问题。


从语法上讲,Synchronized总共有三种用法:

  (1)修饰普通方法

  (2)修饰静态方法

  (3)修饰代码块


接下来我就通过几个例子程序来说明一下这三种使用方式(为了便于比较,三段代码除了Synchronized的使用方式不同以外,其他基本保持一致)


1、没有同步的情况:

代码段一:

package com.paddx.test.concurrent;

public class SynchronizedTest {
  public void method1(){
   
    System.out.println("Method 1 start");
    try {
      System.out.println("Method 1 execute");
      Thread.sleep(3000);
    } catch (InterruptedException e) {
       e.printStackTrace();
    }
    System.out.println("Method 1 end");
  }

  public void method2(){
    System.out.println("Method 2 start");
    try {
      System.out.println("Method 2 execute");
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("Method 2 end");
  }

  public static void main(String[] args) {
    final SynchronizedTest test = new SynchronizedTest();

    new Thread(new Runnable() {
      @Override
      public void run()
{
        test.method1();
      }
    }).start();

    new Thread(new Runnable() {
      @Override
      public void run()
{
        test.method2();
      }
    }).start();
  }
}


执行结果如下,线程1和线程2同时进入执行状态,线程2执行速度比线程1快,所以线程2先执行完成,这个过程中线程1和线程2是同时执行的。