一张图讲解对象锁和关键字synchronized修饰方法(代码块)

来源:互联网 发布:返利网淘宝卖家知道吗 编辑:程序博客网 时间:2024/06/05 07:01

目录(?)[+]

每个对象在出生的时候就有一把钥匙(监视器Monitor),那么被synchronized 修饰的方法相当于给方法加了一个锁,这个方法就可以进行同步,在多线程的时候,不会出现线程安全问题。

注:Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 Monitor。

下面通过一张图片进行讲解:

1.一张图片

图片看不清,请点击这里 : 高清大图

这里写图片描述

2.图片对应的代码

import java.util.Date;/** * 测试的object类 * * @author:dufy * @version:1.0.0 * @date 2017/9/29 * @email 742981086@qq.com */public class ObjectTest {    public synchronized  void methodA(){        try {            System.out.println("This is methodA ...." + Thread.currentThread().getName() + ": " + new Date());            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public void methodB(){        System.out.println("This is methodB ...." + Thread.currentThread().getName() + ": " + new Date());    }    public synchronized void methodC(){        try {            System.out.println("This is methodC ...." + Thread.currentThread().getName() + ": " + new Date());            Thread.sleep(3000);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
package com.dufy.concurrentcode;/** * 测试线程类 * * @author:dufy * @version:1.0.0 * @date 2017/9/29 * @email 742981086@qq.com */public class ThreadTest extends Thread{    public static void main(String[] args) {        ObjectTest ot = new ObjectTest();        Thread1 t1 = new Thread1(ot,"thread1");        Thread2 t2 = new Thread2(ot,"thread2");        Thread3 t3 = new Thread3(ot,"thread3");        Thread4 t4 = new Thread4(ot,"thread4");        t1.start();        t2.start();        t3.start();        t4.start();    }    static class Thread1 extends Thread{        private ObjectTest objectTest;        public Thread1(ObjectTest objectTest,String name){            setName(name);            this.objectTest = objectTest;        }        @Override        public void run() {            super.run();            objectTest.methodA();        }    }    static class Thread2 extends Thread{        private ObjectTest objectTest;        public Thread2(ObjectTest objectTest,String name){            setName(name);            this.objectTest = objectTest;        }        @Override        public void run() {            super.run();            objectTest.methodB();        }    }    static class Thread3 extends Thread{        private ObjectTest objectTest;        public Thread3(ObjectTest objectTest,String name){            setName(name);            this.objectTest = objectTest;        }        @Override        public void run() {            super.run();            objectTest.methodA();        }    }    static class Thread4 extends Thread{        private ObjectTest objectTest;        public Thread4(ObjectTest objectTest,String name){            setName(name);            this.objectTest = objectTest;        }        @Override        public void run() {            super.run();            objectTest.methodC();        }    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

运行结果:

This is methodB ....thread2: Fri Sep 29 23:21:17 CST 2017This is methodA ....thread1: Fri Sep 29 23:21:17 CST 2017This is methodC ....thread4: Fri Sep 29 23:21:18 CST 2017This is methodA ....thread3: Fri Sep 29 23:21:21 CST 2017
阅读全文
0 0