线程学习记录02-线程基础

2017-06-21  本文已影响0人  绝世懒人
public class MultiThread {

private static int num = 0;

public static synchronized void printNum(String tag) {
    try {
        if (tag.equals("a")) {
            LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
            String format = localDateTime.format(DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"));
            System.out.println("a execute time : " + format);
            num = 100;
            System.out.println("tag a , is set over");
            Thread.sleep(10000);
        } else {
            LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
            String format = localDateTime.format(DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss"));
            System.out.println("b execute time : " + format);
            num = 200;
            System.out.println("tag b , is set over");
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    final MultiThread m1 = new MultiThread();
    final MultiThread m2 = new MultiThread();

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            m1.printNum("a");
        }
    });

    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            m2.printNum("b");
        }
    });

    t1.start();
    t2.start();
}}

如上代码,正常情况下我们期望的是,通过synchronized 进行同步,当a执行之后,b等待10秒执行,如下结果

image.png

但是,实际得到的结果却并不如我们所预期的:

image.png

a和b是同时执行的,难道是synchronized 并没有同步?

答案是,synchronized 是正常同步的。但是synchronized 是基于对象的锁

image.png

在线程里面,我们执行的是m1和m2 两个对象。每个对象都是有自己独自的锁,所以在这里代码允许的时候,并没有产生影响,两只可以同时运行。

如果我们希望两个对象能够将synchronized 修饰的方法能够同步,我们可以使用static。

image.png

当使用static 修饰之后,方法就会变为类级别,两个对象之间就能共享类级别上的锁。达到a和b去竞争同一把锁的效果。

上一篇下一篇

猜你喜欢

热点阅读