Synchronized 是 Java 中解决并发问题的一种最常用的方法,也是最简单的一种方法。本文作者将全面剖析 Synchronized 的底层原理。 
Synchronized 的基本使用 Synchronized 的作用主要有三个: - 确保线程互斥的访问同步代码
- 保证共享变量的修改能够及时可见
- 有效解决重排序问题
从语法上讲,Synchronized 总共有三种用法: 接下来我就通过几个例子程序来说明一下这三种使用方式(为了便于比较,三段代码除了 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 是同时执行的: - Method 1 start
- Method 1 execute
- Method 2 start
- Method 2 execute
- Method 2 end
- Method 1 end
对普通方法同步 代码段 2: - package com.paddx.test.concurrent;
-
- public class SynchronizedTest {
- public synchronized 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 synchronized 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 需要等待线程 1 的 Method1 执行完成才能开始执行 Method2 方法。 - Method 1 start
- Synchronized
|