欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

我们直接参考JVM规范中描述: ` Each object is associated with a monitor.

点击: 次  来源:昆山软开发 时间:2018-06-25

原文出处: winger@文哥

synchronized的根基利用">Synchronized的根基利用

Synchronized是Java中办理并发问题的一种最常用的要领,也是最简朴的一种要领。Synchronized的浸染主要有三个:

  1. 确保线程互斥的会见同步代码
  2. 担保共享变量的修改可以或许实时可见
  3. 有效办理重排序问题。

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

  1. 修饰普通要领
  2. 修饰静态要领
  3. 修饰代码块

接下来我就通过几个例子措施来说明一下这三种利用方法(为了便于较量,三段代码除了Synchronized的利用方法差异以外,其他根基保持一致)。

  • 没有同步的环境
  • 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
  • 对普通要领同步
  • 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();
        }
    }

    执行功效如下,跟代码段一较量,可以很明明的看出,线程2需要期待线程1的method1执行完成才气开始执行method2要领。

    Method 1 start
    Method 1 execute
    Method 1 end
    Method 2 start
    Method 2 execute
    Method 2 end
  • 静态要领(类)同步
  • package com.paddx.test.concurrent;
    
     public class SynchronizedTest {
         public static 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 static 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();
             final SynchronizedTest test2 = new SynchronizedTest();
    
             new Thread(new Runnable() {
                 @Override
                 public void run() {
                     test.method1();
                 }
             }).start();
    
             new Thread(new Runnable() {
                 @Override
                 public void run() {
                     test2.method2();
                 }
             }).start();
         }
     }