Java并发编程之Synchronized——线程同步(上)

       由于同一进程的多个线程共享同一块存储空间,在带来方便的同时,也带来了访问冲突的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问造成的这种问题。
        由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是synchronized关键字。

想要更加清楚的理解Synchronized关键字,则必须了解以下的几种概念。
1、线程安全
2、并发编程的三大特性
3、竞态条件与临界区
4、Java的内存模型
关于这几个概念,这里就不一一展开详述了,大家可以通过网络或者书籍都可以找到。

Synchronized的三种应用方式

  1. 普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁

  2. 静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁

  3. 同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

一、实例方法同步


    Java实例方法同步是同步在拥有该方法的对象上。这样,每个实例其方法同步都同步在不同的对象上,即该方法所属的实例。只有一个线程能够在实例方法同步块中运行。如果有多个实例存在,那么一个线程一次可以在一个实例同步块中执行操作。一个实例一个线程。

二、静态方法同步


    静态方法的同步是指同步在该方法所在的类对象上。因为在Java虚拟机中一个类只能对应一个类对象,所以同时只允许一个线程执行同一个类中的静态同步方法。对于不同类中的静态同步方法,一个线程可以执行每个类中的静态同步方法而无需等待。不管类中的那个静态同步方法被调用,一个类只能由一个线程同时执行。

三、同步方法块


    为什么要同步代码块呢?在某些情况下,我们编写的方法体可能比较大,同时存在一些比较耗时的操作,而需要同步的代码又只有一小部分,如果直接对整个方法进行同步操作,可能会得不偿失,此时我们可以使用同步代码块的方式对需要同步的代码进行包裹,这样就无需对整个方法进行同步操作了。

注:本文为Wayne原创,未经许可不得在任何平台转载。如需转载,与作者联系~

关注微信公众号:技术训练营(微信ID:TechBootcamp),可以Java交流群16844592,获取更多资获取更多资讯~



posted on 2020-04-17 16:55  智识训练营  阅读(184)  评论(0)    收藏  举报