首页 >  Java开发 >  Java中Synchronized的详细用法

Java中Synchronized的详细用法

发布时间:2019-5-27 10:28阅读量:36
摘要: Synchronized 是 Java 中解决并发问题的一种最常用的方法,也是最简单的一种方法。本文作者将全面剖析 Synchronized 的底层原理。

Synchronized 是 Java 中解决并发问题的一种最常用的方法,也是最简单的一种方法。本文作者将全面剖析 Synchronized 的底层原理。

Java中Synchronized的详细用法

Synchronized 的基本使用

Synchronized 的作用主要有三个:

  • 确保线程互斥的访问同步代码
  • 保证共享变量的修改能够及时可见
  • 有效解决重排序问题

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

  • 修饰普通方法
  • 修饰静态方法
  • 修饰代码块

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

没有同步的情况

代码段 1:

  1. package com.paddx.test.concurrent; 
  2.  
  3. public class SynchronizedTest { 
  4.   public void method1(){ 
  5.  
  6.     System.out.println("Method 1 start"); 
  7.     try { 
  8.       System.out.println("Method 1 execute"); 
  9.       Thread.sleep(3000); 
  10.     } catch (InterruptedException e) { 
  11.        e.printStackTrace(); 
  12.     } 
  13.     System.out.println("Method 1 end"); 
  14.   } 
  15.  
  16.   public void method2(){ 
  17.     System.out.println("Method 2 start"); 
  18.     try { 
  19.       System.out.println("Method 2 execute"); 
  20.       Thread.sleep(1000); 
  21.     } catch (InterruptedException e) { 
  22.       e.printStackTrace(); 
  23.     } 
  24.     System.out.println("Method 2 end"); 
  25.   } 
  26.  
  27.   public static void main(String[] args) { 
  28.     final SynchronizedTest test = new SynchronizedTest(); 
  29.  
  30.     new Thread(new Runnable() { 
  31.       @Override 
  32.       public void run() { 
  33.         test.method1(); 
  34.       } 
  35.     }).start(); 
  36.  
  37.     new Thread(new Runnable() { 
  38.       @Override 
  39.       public void run() { 
  40.         test.method2(); 
  41.       } 
  42.     }).start(); 
  43.   } 

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

这个过程中线程 1 和线程 2 是同时执行的:

  1. Method 1 start 
  2. Method 1 execute 
  3. Method 2 start 
  4. Method 2 execute 
  5. Method 2 end 
  6. Method 1 end 

对普通方法同步

代码段 2:

  1. package com.paddx.test.concurrent; 
  2.  
  3. public class SynchronizedTest { 
  4.   public synchronized void method1(){ 
  5.     System.out.println("Method 1 start"); 
  6.     try { 
  7.       System.out.println("Method 1 execute"); 
  8.       Thread.sleep(3000); 
  9.     } catch (InterruptedException e) { 
  10.       e.printStackTrace(); 
  11.     } 
  12.     System.out.println("Method 1 end"); 
  13.   } 
  14.  
  15.   public synchronized void method2(){ 
  16.     System.out.println("Method 2 start"); 
  17.     try { 
  18.       System.out.println("Method 2 execute"); 
  19.       Thread.sleep(1000); 
  20.     } catch (InterruptedException e) { 
  21.       e.printStackTrace(); 
  22.     } 
  23.     System.out.println("Method 2 end"); 
  24.   } 
  25.  
  26.   public static void main(String[] args) { 
  27.     final SynchronizedTest test = new SynchronizedTest(); 
  28.  
  29.     new Thread(new Runnable() { 
  30.       @Override 
  31.       public void run() { 
  32.         test.method1(); 
  33.       } 
  34.     }).start(); 
  35.  
  36.     new Thread(new Runnable() { 
  37.       @Override 
  38.       public void run() { 
  39.         test.method2(); 
  40.       } 
  41.     }).start(); 
  42.   } 

执行结果如下,跟代码段 1 比较,可以很明显的看出,线程 2 需要等待线程 1 的 Method1 执行完成才能开始执行 Method2 方法。

  1. Method 1 start 
  2. Synchronized

鲜花

握手

雷人

路过

鸡蛋
最新图文推荐
  • 2
  • 3
发表评论

最新评论