Java 中 方法锁、对象锁和类锁区别

今天我们来简单聊下一个Java中锁的知识点,需要结合synchronized进行分析。

synchronized 用来处理多个线程同时访问同一个类的一个代码块、方法、甚至是这个类。

  1. 修饰代码块 需要一个reference对象作为锁的对象。
  2. 修饰方法时,默认是当前对象作为锁的对象
  3. 修饰类时,默认当前类的Class对象作为锁的对象

1、对象锁

当一个对象中有同步方法或者同步块时,线程调用此对象进入该同步区域时,必须获得对象锁。

如果此对象的对象锁被其他调用者占用,则进入阻塞队列,等待此锁被释放(同步块正常返回或者抛异常终止,由JVM自动释放所)

注意,方法锁也是一种对象锁,当一个线程访问一个带synchronized方法时,由于对象锁的存在,所有加synchronized的方法都不能被访问,(前提是在多个线程调用的是同一个对象实例中的方法)

public class Locker {

    public synchronized void test(){

        System.out.println("对象锁也是方法锁");

    }
}
public class Locker {

    public void method(){
        synchronized(this){
            System.out.println("对象锁,方法还是可以进来");
        }
    }
}

2、类锁

静态方法和静态变量都是属于类级别的,只会加载和初始化一份。静态方法一旦被声明为 synchronized,那么该类所有实例化对象共用一把锁,即类锁,如下两种方式:

public class Locker {
    public static synchronized void method(){
        System.out.println("类锁");
    }
}
public class Locker {
    public void method(){
        synchronized (object.this) {
            System.out.println("类锁");
        }
    }
}
展开阅读全文

页面更新:2024-05-17

标签:对象   方法   队列   知识点   初始化   线程   变量   静态   实例   前提   加载   异常   区别   级别   声明   代码   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top