• 浅析多线程的对象锁和Class锁


    一、前言

    本来想在另外一篇文章说的,发现可能篇幅有点大,所以还是另开一篇博文来说好了。知识参考《Java多线程编程核心技术》,评价下这本书吧——大量的代码,简单的说明,真像在看博客。不过这本书浅显易懂,篇幅也不长,一口气看个几十页,再照着demo敲敲代码,简直不要太爽。。哈哈

    二、概念

    对象锁:顾名思义,就是这个锁属于这个类的对象实例,可以通过为类中的非静态方法加synchronized关键字 或者使用 synchronized(this) 代码块,为程序加对象锁。

    Class锁:顾名思义,就是这个锁属于这个Class类,所以即使是不同的实例对象仍然拥有的是同一个锁,可以通过为类中的静态方法加synchronized关键字 或者使用 synchronized(*.Class) 代码块,为程序加Class锁。

    三、代码说明

    public class Task {
        //Class锁
        synchronized public static void printA() {
            try {
                System.out.println(
                        "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "进入printA");
                Thread.sleep(3000);
                System.out.println(
                        "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "离开printA");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        //Class锁
        public static void printB() {
            try {
                synchronized (Task.class) {//通过这种方式定义的Class锁
                    System.out.println(
                            "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "进入printB");
                    Thread.sleep(3000);
                    System.out.println(
                            "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "离开printB");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        //对象锁
        synchronized public void printC() {
            try {
                System.out.println(
                        "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "进入printC");
                Thread.sleep(3000);
                System.out.println(
                        "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "离开printC");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        //对象锁
        public void printD() {
            try {
                synchronized (this){//通过这种方式定义的对象锁
                    System.out.println(
                            "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "进入printD");
                    Thread.sleep(3000);
                    System.out.println(
                            "线程名称为:" + Thread.currentThread().getName() + "在" + System.currentTimeMillis() + "离开printD");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    四、总结

    1、Class锁和对象锁是属于不同的锁,属于异步执行,存在争抢作用。

    2、Class锁对当前的*.java文件对应的Class类进行持锁,对这个类的所有实例对象起作用。而对象锁只对自己的实例对象起作用。

  • 相关阅读:
    C# 综合练习题目 及 答案解析
    SQL数据库子查询练习题及解析
    SQL数据库 连接查询、变量、选择、循环、延时语句等
    SQL数据库中模糊查询、排序、聚合函数、数学函数、字符串函数、时间日期函数、转换、函数转换等
    SQL数据库的创建及简单增删改查语句运用
    SQL数据库简介
    ado.net操作数据库
    轻松美化窗体
    面向对象(委托)
    面向对象(五大原则)
  • 原文地址:https://www.cnblogs.com/jmcui/p/7493870.html
Copyright © 2020-2023  润新知