您现在的位置:首页 >> 前端 >> 内容

synchronized对象监视器为Class时的使用讲解

时间:2018/3/30 14:39:26 点击:

  核心提示:synchronized加到静态方法上或者synchronized(class)代码块是给Class类上锁。Class锁对类的所有对象都其作用。例如:1、创建一个Service类package com...

synchronized加到静态方法上或者synchronized(class)代码块是给Class类上锁。Class锁对类的所有对象都其作用。例如:

1、创建一个Service类

package com.iie;

/**
 * Created by bo on 2018/3/29.
 */
public class Service {

    synchronized public static void printA() {
        try {
            System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "进入printA");
            Thread.sleep(3000);
            System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "离开printA");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    synchronized public static void printB() {
        try {
            System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "进入printB");
            Thread.sleep(3000);
            System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "离开printB");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

2、创建线程ThreadA调用printA()方法,线程ThreadB调用printB()方法。

package com.iie;

/**
 * Created by bo on 2018/3/29.
 */
public class ThreadA extends Thread {
    private Service service;

    public ThreadA(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.printA();
    }
}
package com.iie;

/**
 * Created by bo on 2018/3/29.
 */
public class ThreadB extends Thread {
    private Service service;

    public ThreadB(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.printB();
    }

}

3、创建main线程,运行。

package com.iie;

/**
 * Created by bo on 2018/3/26.
 */
public class Run {

    public static void main(String[] args) throws InterruptedException {
        Service serviceA = new Service();
        Service serviceB = new Service();
        ThreadA threadA = new ThreadA(serviceA);
        threadA.setName("a");
        ThreadB threadB = new ThreadB(serviceB);
        threadB.setName("b");

        threadA.start();
        threadB.start();
    }

}

执行结果:

synchronized对象监视器为Class时的使用讲解

可以看到,虽然创建了两个对象,但是还是同步执行,即Class锁对所有的对象实例都起作用。

Tags:SY YN NC CH 
作者:网络 来源:bobozai86的