两个线程同时访问一个对象的静态同步方法和非静态同步方法(synchronized)

示例代码

public class TestMain implements Runnable {
    //格式化
    static SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public void run() {
        //让线程Thread-0执行静态同步方法
        if ("Thread-0".equals(Thread.currentThread().getName())) {
            synchronizedStaticMethod();
        } else {
            //让线程Thread-1执行普通同步方法
            synchronizedMethod();
        }
    }


    public static synchronized void synchronizedStaticMethod() {
        Date satrtTime = new Date();
        String time = sim.format(satrtTime);
        System.out.println(time + ":【" + Thread.currentThread().getName() + "访问了静态同步方法】");
        try {
            //睡眠3秒
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Date endTime = new Date();
        String time2 = sim.format(endTime);
        System.out.println(time2 + ":【" + Thread.currentThread().getName() + "准备退出这个静态同步方法】");
    }

    public synchronized void synchronizedMethod() {
        Date satrtTime = new Date();
        String time = sim.format(satrtTime);
        System.out.println(time + ":【" + Thread.currentThread().getName() + "访问了普通同步方法】");
        try {
            //睡眠3秒
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Date endTime = new Date();
        String time2 = sim.format(endTime);
        System.out.println(time2 + ":【" + Thread.currentThread().getName() + "准备退出这个普通同步方法了】");
    }

    public static void main(String[] args) throws Exception {
        //创建一个对象testMain1
        TestMain testMain1 = new TestMain();
        System.out.println("运行开始");
        Thread thread1 = new Thread(testMain1);
        Thread thread2 = new Thread(testMain1);
        thread1.start();
        thread2.start();
        //让主线程做个等待,等线程一和线程二都执行完它才继续执行
        thread1.join();
        thread2.join();
        System.out.println("运行结束");
    }
}

运行结果:

在这里插入图片描述

总结

从运行结果可以看出,Thread-0和Thread-1是并行执行的,不存在先后顺序,所以可以得出虽然用来测试的对象是测试类的实例,但类也是一种特殊的对象,而静态同步方法加的锁是类锁,普通同步方法加的是对象锁,两个锁是不同的,所以自然不存在竞争。

发布了200 篇原创文章 · 获赞 201 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104440920