要么改变世界,要么适应世界

Java中给静态方法添加synchronized时候的锁

2020-10-29 11:20:19
392
目录

java静态方法上面加synchronized的时候,是把当前类的Class类对象进行持锁。例如下面的例子:

Service.java:分别提供两个静态方法和一个非静态方法

package com.yalexin.thread.demo03;

/**
 * Author:Yalexin
 * Email: 181303209@yzu.edu.cn
 */
public class Service {
    synchronized public static void printA() {
        System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
                System.currentTimeMillis() + " 进入 printA()");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
                System.currentTimeMillis() + " 退出 printA()");
    }

    synchronized public static void printB() {
        System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
                System.currentTimeMillis() + " 进入 printB()");
        System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
                System.currentTimeMillis() + " 退出 printB()");
    }

    synchronized public void printC() {
        System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
                System.currentTimeMillis() + " 进入 printC()");
        System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
                System.currentTimeMillis() + " 退出 printC()");
    }
}

线程A调用静态方法A

package com.yalexin.thread.demo03;

/**
 * Author:Yalexin
 * Email: 181303209@yzu.edu.cn
 */
public class ThreadA extends Thread{
    public ThreadA(Service service) {
        this.service = service;
    }

    private Service service;
    @Override
    public void run() {
        service.printA();
    }
}

线程B调用静态方法B

package com.yalexin.thread.demo03;

/**
 * Author:Yalexin
 * Email: 181303209@yzu.edu.cn
 */
public class ThreadB extends Thread{
    public ThreadB(Service service) {
        this.service = service;
    }

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

进程C调用非静态方法C

package com.yalexin.thread.demo03;

/**
 * Author:Yalexin
 * Email: 181303209@yzu.edu.cn
 */
public class ThreadC extends Thread{
    public ThreadC(Service service) {
        this.service = service;
    }

    private Service service;
    @Override
    public void run() {
        service.printC();
    }
}

输出:

thread name = AAAA 在 1603940400153 进入 printA()
thread name = CCCC 在 1603940400153 进入 printC()
thread name = CCCC 在 1603940400153 退出 printC()
thread name = AAAA 在 1603940402169 退出 printA()
thread name = BBBB 在 1603940402169 进入 printB()
thread name = BBBB 在 1603940402169 退出 printB()

可以看到

A方法和B方法是同步的,是因为synchronized关键字加到静态方法上面的时候,是将Service类的Class类对象作为锁,而C方法和A或者B方法是异步的,是因为synchronized关键字加到非静态方法上面的时候,是将Service类的实例化对象作为锁,即C方法的锁和A或B的锁是两个不同的锁,二者可以异步进行。

历史评论
开始评论