Java的synchronized用法

原创 2016年08月30日 16:43:04

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)

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

版权声明:本文为博主学习总结文章,欢迎大家评论分享。

java中几种synchronized用法总结

文章为自己测试后所写,有说得不对的地方希望看到的大神能够指出来让我得以改正,以免误导其他同行 synchronized方法,synchronized静态方法,synchronized(this),sy...
  • apeng_1102
  • apeng_1102
  • 2016年09月28日 09:31
  • 471

Java 彻底弄明白synchronized的使用

多个线程访问共享资源(临界资源)的时候,会出现线程安全问题,安全问题大多数是可见性问题和原子性问题。 可见性: 例如执行多个线程执行a++,那么多个线程就会被分配到不同的处理器上,每个处理器都从主存上...
  • oxuanboy1
  • oxuanboy1
  • 2016年06月23日 18:08
  • 1971

JAVA线程安全之synchronized关键字的正确用法

JAVA线程安全关于synchronized关键字的用法,今天才知道原来我一直错了。以为用了synchronized关键字包住了代码就可以线程同步安全了。 测试了下。发现是完全的错了。syn...
  • WALLEZhe
  • WALLEZhe
  • 2016年08月23日 13:48
  • 752

Java中synchronized的使用实例

一、使用场景在负责后台开发的时候,很多时候都是提供接口给前端开发人员去调用,会遇到这样的场景:需要提供一个领奖接口,每个用户名只能领取一次,我们可以将成功领取的用户在数据库用个标记保存起来。如果这个用...
  • u013142781
  • u013142781
  • 2015年12月30日 11:45
  • 6893

Java中Synchronized和Lock的使用和区别

转载自:http://blog.csdn.net/imzoer/article/details/9457639  Lock的锁定是通过代码实现的,而 synchronized 是在 JVM 层面...
  • zgrjkflmkyc
  • zgrjkflmkyc
  • 2016年03月02日 11:43
  • 3869

深入研究 Java Synchronize 和 Lock 的区别与用法

在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方。 ...
  • natian306
  • natian306
  • 2014年01月19日 15:22
  • 35126

java中synchronized理解与使用

同步锁的基本理解当synchronized锁住一个对象后,别的线程如果也想拿到这个对象的锁,就必须等待这个线程执行完成释放锁,才能再次给对象加锁,这样才达到线程同步的目的。即使两个不同的代码段,都要锁...
  • jianiuqi
  • jianiuqi
  • 2016年12月03日 23:19
  • 225

java中synchronized的用法详解

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchronize...
  • zh521zh
  • zh521zh
  • 2016年04月13日 16:56
  • 318

Java并发——线程同步Volatile与Synchronized详解

Java面试——线程同步volatile与synchronized详解 0. 前言面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现线程安全...
  • SEU_Calvin
  • SEU_Calvin
  • 2016年08月30日 19:09
  • 13565

synchronized是什么方法?干什么用的?

 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. synchronized 方法:通过在方法声明中加入 synchro...
  • qw222pzx
  • qw222pzx
  • 2016年09月22日 10:29
  • 911
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的synchronized用法
举报原因:
原因补充:

(最多只允许输入30个字)