浅析多线程的对象锁和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类进行持锁,对这个类的所有实例对象起作用。而对象锁只对自己的实例对象起作用。

时间: 2024-09-29 07:43:48

浅析多线程的对象锁和Class锁的相关文章

从头认识多线程-2.2 synchronized持有对象锁与类锁的相同点

这一章节我们来讨论一下synchronized持有对象锁与类锁的相同点. 1.当所有方法都不使用同步的时候 代码清单 package com.ray.deepintothread.ch02.topic_2; public class SynchInstance1 { public static void main(String[] args) throws InterruptedException { MyTestObjectOne myTestObjectOne = new MyTestObj

Java对象锁和类锁全面解析(多线程synchronized关键字)

最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没用对都不知道. 今天把一些疑惑都解开了,写篇文章分享给大家,文章还算比较全面.当然可能有小宝鸽理解得不够深入透彻的地方,如果说得不正确还望指出. 看之前有必要跟某些猿友说一下,如果看一遍没有看明白呢,也没关系,当是了解一下,等真正使用到了,再回头看. 本文主要是将synchronized关键字用法作

Java多线程 同步 对象锁

多线程.同步: https://www.cnblogs.com/GarfieldEr007/p/5746362.html Java对象锁和类锁全面解析(多线程synchronized关键字): http://blog.csdn.net/u013142781/article/details/51697672 Java Object对象中的wait,notify,notifyAll通俗理解 http://blog.csdn.net/vk5176891/article/details/53945677

从头认识多线程-2.3 synchronized持有对象锁与类锁的不同点

这一章节我们来讨论游戏,synchronized持有对象锁与类锁的不同点-两种锁是并行的东西,没有交集. 1.同步持有对象锁或者类锁 package com.ray.deepintothread.ch02.topic_3; public class SynchInstance5 { public static void main(String[] args) throws InterruptedException { MyTestObjectFive myTestObjectFive = new

Android多线程研究(9)——线程锁Lock

在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活和广泛的锁定对象操作,而且是以面向对象的方式进行对象加锁. @Override public void run() { while(true){ Lock lock = new ReentrantLock(); try { lock.lock(); Thread.sleep(new Random()

多线程编程-- part5.1 互斥锁之公平锁-获取锁

基本概念 1.AQS:AbstractQueuedSynchronizer类 AQS是java中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现.AQS是独占锁(例如,ReentrantLock)和共享锁(例如,Semaphore)的公共父类. (01) 独占锁 -- 锁在一个时间点只能被一个线程锁占有.根据锁的获取机制,它又划分为“公平锁”和“非公平锁”.公平锁,是按照通过CLH等待线程按照先来先得的规则,公平的获取锁:而非公平锁,则当线程要获取锁时,它会无视CLH等待队列而直接获取锁.

java 类锁与对象锁(实例锁)同步问题

众所周知,synchronized可修饰方法和代码块,可作用于类或者对象. 当修饰代码块时,synchronized(object) 作用于对象,只约束该对象. synchronized(class)作用于类,约束类所有的对象. 修饰方法时,synchronized 修饰static方法时,作用于类.修饰非static方法时作用于对象. 注意类锁和对象锁是两个不同的锁,二者不会发生同步关系. 由于static变量,可被static方法调用,也可被非static方法调用,当二者同时被synchro

【转】互斥对象锁和临界区锁性能比较

原作者:chexlong 原文地址:http://blog.csdn.net/chexlong/article/details/7060425 在Win32平台上进行多线程编程,常会用到锁.下边用C++实现了互斥对象(Mutex)锁和临界区(CRITICAL_SECTION)锁,以加深理解和今后方便使用.代码已在VS2005环境下编译测试通过. Lock.h [cpp] view plaincopy #ifndef _Lock_H #define _Lock_H #include <window

多线程编程-- part 5.2 JUC锁之Condition条件

1.Condition介绍 Condition的作用是对锁进行更精确的控制.Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法.不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑使用的:而Conditi