Java多线程基础 05.synchronized关键字

synchronized关键字

  Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。

synchronized 方法

  如果声明了一个方法时,在前面加上关键字synchronized,那么这个方法就每次只能由一个线程运行。这种方法称为synchronized方法,有时也称为同步方法。


public synchronized void run(){
    
}

synchronized 代码块

  如果只是想让方法中的某一部分由一个线程运行,而非整个方法,则可使用synchronized代码块,格式如下。

synchronized(对象){
    
}

下面两个是等效的。


public synchronized void run(){
    
}

public void run(){
    synchronized (this) {
        
    }
}

  synchronized 静态方法每次也只能由一个线程运行,但是加锁的方法有所不同。
下面两个是等效的。

class A{
    public static synchronized void run(){
    
    }
}

class A{
    public static void run(){
        synchronized (A.class) {
        
        }
    }
}
总结

  synchronized的核心还是synchronized代码块中锁住的对象。对象的锁只能同时被一个线程获得,对象锁被锁住的是对象本身,类锁锁住的是对象的class对象。所以下面代码中的2个方法可以同时执行。

class A{
    public void run1(){
        synchronized (this) {
        
        }
    }
    
     public static void run2(){
        synchronized (A.class) {
        
        }
    }
}

小tips

  当前线程是否已获得某一对象的锁可以通过Thread.holdsLock(Object)方法来确定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值