Java的synchronized用法

Java的并发是个细活儿,作者目前码码过程中还没涉及到临界资源的并发访问。今天看到一篇不错的文章Java中Synchronized的用法,将其记录消化下。
什么时候需要同步呢?Think in Java中有这么一段“如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么必须同步,并且,读写线程都必须用相同的监视器锁同步。每个访问临街共享资源的方法都要被同步。“。最常见的同步方式是使用synchronized,Java5以后提供了其他方式,这里暂不讨论,只提synchronized的几种用法。

  1. 修饰一个代码块
  2. 修饰一个普通方法
  3. 修饰一个静态方法
  4. 修饰一个类

1.代码块

synchronized(this){
...
}

需要注意的是synchronized只锁定当前对象,每个对象只有一个锁(lock)与之相关联。也就是说同个对象多个线程调用执行的时候会被同步,多个不同对象分别被线程调用的时候,每个对象有各自的对象锁,不会互斥执行。还有一个注意点就是对象锁锁住了当前对象下的所有synchronized方法,对象的非synchronized方法,其他线程可以正常访问。
除了锁定对象本身外,还可以指定锁定的对象,哪个线程拿到该对象的锁,哪个线程就可以发起访问。当没有明确的对象作为锁时,可以用private byte[] lock = new byte[0];生成一个lock对象,充当锁。

2.普通方法

public synchronized void method(){
...
}

修饰方法和修饰代码段很接近,两者也可互换。要注意的是synchronized方法不能被继承,就是说,父类的synchronized方法,子类继承该方法时,除非显示声明synchronized,不然在子类中不具有同步属性。

3.静态方法

用法和普通方法类似。静态方法属于类,所以被synchronized修饰时,持有的是类锁,也就是只要有一个类的对象在访问该方法,类的其他所有对象都不能访问该方法。

4.类

class className{
    method(){
        synchronized(className.class){
            ...
        }
    }
}

需要注意的是,给类加锁并不是在声明类的时候用synchronized去修饰,而是synchronized持有的锁是类。

总结

综上四种方式不难发现,synchronized的使用格式来看可以分为两类:代码块、方法(包括:一般方法和静态方法)。从synchronized的作用粒度来看也可以分为两类:对象(包括:this、指定object或者instance)和类(包括:ClassName.class或者static method)

很惭愧,做了一点微小的贡献!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值