您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java并发多线程编程——Synchronized关键字的原理(理论层面)

小志的博客 发布时间:2021-04-16 08:40:56 ,浏览量:0

目录
    • 一、内置锁与互斥锁
    • 二、Synchronized修饰普通方法
    • 三、Synchronized修饰静态方法
    • 四、Synchronized修饰代码块

一、内置锁与互斥锁
  • 内置锁:每个java对象都可以用做一个实现同步的锁,这些锁被称为内置锁(Intrinsic)或监视锁(Monitor Lock)。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁。
  • 互斥锁:java的内置锁相当于一种互斥体(或互斥锁),这意味着最多只有一个线程能持有这种锁。
二、Synchronized修饰普通方法

1、代码

public class Test {
    private int value;

    /**
     * synchronized 修饰普通方法时,内置锁就是当前类的实例
     * @return
     */
    public synchronized int getValue(){
        return value++;
    }
}

2、结论:

  • synchronized 修饰普通方法时,内置锁就是当前类的实例
三、Synchronized修饰静态方法

1、代码

public class Test1 {
    private static int value;

    /**
     * synchronized 修饰静态方法时,内置锁是当前的Class字节码对象
     * @return
     */
    public static synchronized int getValue(){
        return value--;
    }
}

2、结论:

  • synchronized 修饰静态方法时,内置锁是当前的Class字节码对象
四、Synchronized修饰代码块
  • 在某些情况下,我们编写的方法体可能比较大,同时存在一些比较耗时的操作,而需要同步的代码又只有一小部分,如果直接对整个方法进行同步操作,可能会得不偿失,此时我们可以使用同步代码块的方法对需要同步的代码进行包裹,这样就无需对整个方法进行同步操作了。

  • 我们可以使用如下几种对象来作为锁的对象: 1、成员锁(锁的对象是变量)

    public class Test2 {
    	public Object getValue(Object obj){
            synchronized (obj){
               //操作
            }
        }
    }
    

    2、实例对象锁

    public class Test3 {
    	synchronized(this) {
    	   //操作
    	}
    }
    

    3、当前类的 class 对象锁

    public class Test4 {
    	synchronized(Test4.class) {
    	 //操作
    	}
    }
    
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0407s