static对象锁结合synchronized的代码块的线程现象分析

目录

目录

一、代码如下

1、创建一个Thread的子类并重写run方法

2、创建一个类,新建线程并启动该线程

3、运行结果如下

二、该输出结果产生的原因

1、为啥这个锁的hashCode是相同的,即锁是同一个锁,lock是同一个对象?

2、 Synchronized的运行原理?




一、代码如下

1、创建一个Thread的子类并重写run方法

package itcast;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyThread1 extends  Thread{

    private static  Object lock = new Object();//定义一个静态的锁
    private static  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
    @Override
    public void run() {//重写Thread的run方法
        test_one();
    }

    private static  void test_one(){//定义static的方法
        synchronized (lock){
            //记录lock对象的hash值(可用于判断其在方法区内的地址值是否有所改变) + 该线程的名字 + 某线程进入此方法时的时间
            System.out.println(lock.hashCode() +":"+Thread.currentThread().getName()+" begin time: "+sdf.format(new Date()));

            try{
                Thread.sleep(1000); //某线程睡眠1秒
            }catch (Exception e) {

            }finally {
                //记录lock对象的hash值(可用于判断其在方法区内的地址值是否有所改变)+ 该线程的名字 + 某线程结束调用此方法时的时间
                System.out.println(lock.hashCode() +":"+Thread.currentThread().getName()+"   end time: "+sdf.format(new Date()));
            }

        }
    }
}

 

2、创建一个类,新建线程并启动该线程

package itcast;

public class MyThreadDemo {

    public static void main(String[] args) {
        MyThread1 myThread1 = null;//

        for(int i = 1;i<=10;i++){//循环10次,总共创建10个线程
            myThread1 = new MyThread1();//创建一个线程
            myThread1.setName("wjc "+i);
            myThread1.start();//启动该线程,再由JVM调用run()方法
        }
    }

}

3、运行结果如下

运行的结果表明10个线程互斥共用一个锁资源。

就好比火车上10个人公用一个厕所,必须先等前一个人上好厕所(释放锁)后一个人才能继续上厕所(获取锁)。

709440817:wjc 2 begin time: 2020-06-07 15:42:03
709440817:wjc 2   end time: 2020-06-07 15:42:04
709440817:wjc 4 begin time: 2020-06-07 15:42:04
709440817:wjc 4   end time: 2020-06-07 15:42:05
709440817:wjc 3 begin time: 2020-06-07 15:42:05
709440817:wjc 3   end time: 2020-06-07 15:42:06
709440817:wjc 8 begin time: 2020-06-07 15:42:06
709440817:wjc 8   end time: 2020-06-07 15:42:07
709440817:wjc 9 begin time: 2020-06-07 15:42:07
709440817:wjc 9   end time: 2020-06-07 15:42:08
709440817:wjc 10 begin time: 2020-06-07 15:42:08
709440817:wjc 10   end time: 2020-06-07 15:42:09
709440817:wjc 1 begin time: 2020-06-07 15:42:09
709440817:wjc 1   end time: 2020-06-07 15:42:10
709440817:wjc 5 begin time: 2020-06-07 15:42:10
709440817:wjc 5   end time: 2020-06-07 15:42:11
709440817:wjc 7 begin time: 2020-06-07 15:42:11
709440817:wjc 7   end time: 2020-06-07 15:42:12
709440817:wjc 6 begin time: 2020-06-07 15:42:12
709440817:wjc 6   end time: 2020-06-07 15:42:13

二、该输出结果产生的原因

弄懂该输出结果长生的原因,我认为要以下几个问题。

1、为啥这个锁的hashCode是相同的,即锁是同一个锁,lock是同一个对象?

2、Synchronized的运行原理?

1、为啥这个锁的hashCode是相同的,即锁是同一个锁,lock是同一个对象?

首先要明白static的加载规律(这边需要知道的是static在类加载时就加载了无论程序创建多少次对象,静态代码块只加载一次)

    可参考下面的博客

 局部代码块 构造代码块 静态代码块 成员变量 静态变量执行顺序

static在内存中的分布(static在方法区中开辟空间)

    可参考下面的博客

java 堆 栈 方法区 数据存放 操作流程

所以该程序的lock对象锁是同一个锁。该程序的内存分布图如下(这边举例的例子是假设创建2个线程):

static对象锁结合synchronized的代码块的线程现象分析_第1张图片

2、 Synchronized的运行原理?

只要知道对象,对象监视器,同步队列以及执行线程状态之间的关系:

static对象锁结合synchronized的代码块的线程现象分析_第2张图片

可参考以下简书内容:

让你彻底理解Synchronized 

你可能感兴趣的:(JAVA学习)