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

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去竞争同一把锁的效果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,686评论 18 399
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 8,127评论 1 18
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 10,273评论 12 45
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,196评论 0 11
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 12,085评论 3 87

友情链接更多精彩内容