站内搜索:
首页 >> 前端 >> 内容
synchronized对象监视器为Class时的使用讲解

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

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锁对所有的对象实例都起作用。

  • 上一篇:友情链接logo图进行自动轮播代码实现教程
  • 下一篇:readyState的5种状态含义介绍
  • 返回顶部