关闭

Java的synchronized用法

标签: java并发synchroniz
164人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10880次
    • 积分:517
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:2篇
    • 译文:1篇
    • 评论:13条
    文章分类
    最新评论