synchronized同步块的同步性

来源:互联网 发布:php 文件管理插件 编辑:程序博客网 时间:2024/05/21 10:22
class ObjectService {    public void serviceMethodA(){        try{            synchronized (this){                System.out.println("A begin time = " + System.currentTimeMillis());                Thread.sleep(2000);                System.out.println("A end time = " + System.currentTimeMillis());            }        }catch (InterruptedException e){            e.printStackTrace();        }    }    public void serviceMethodB(){        synchronized (this){            System.out.println("B begin time = " + System.currentTimeMillis() );            System.out.println("B end time = " + System.currentTimeMillis());        }    }}class ThreadA extends  Thread {    private  ObjectService service;    public ThreadA(ObjectService service){        this.service = service;    }    @Override    public void run() {        service.serviceMethodA();    }}class ThreadB extends  Thread {    private  ObjectService service;    public ThreadB(ObjectService service){        this.service = service;    }    @Override    public void run() {        service.serviceMethodB();    }}public class Run {    public static void main(String[] args) {        ObjectService service = new ObjectService();        ThreadA a = new ThreadA(service);        a.setName("a");        a.start();        ThreadB b = new ThreadB(service);        b.setName("b");        b.start();    }}

结果:

A begin time = 1458139127424A end time = 1458139129425B begin time = 1458139129425B end time = 1458139129425

即时线程B想调用MethodB,但是因为线程A获取了对象锁,线程B只能等待

  1. 对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态
  2. 同一时间只有一个线程可以执行synchronized同步方法或同步代码块中的代码
0 0
原创粉丝点击