前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >synchronized(修饰方法和代码块)

synchronized(修饰方法和代码块)

作者头像
希希里之海
发布2019-08-30 11:55:37
3.5K0
发布2019-08-30 11:55:37
举报
文章被收录于专栏:weixuqin 的专栏

synchronized(修饰方法和代码块)

1. 含义

  • synchronized 是同步锁,用来实现互斥同步。
  • 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作)。
  • synchronized 还可以保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代 volatile 功能,但是 volatile 更轻量,还是要分场景使用)。

2. 用法

synchronized 包括三种用法:

  • 修饰实例方法
  • 修饰静态方法
  • 修饰代码块
2.1 修饰实例方法

所谓的实例对象锁就是用 synchronized 修饰实例对象中的实例方法,注意是实例方法不包括静态方法,如下:

代码语言:javascript
复制
public synchronized void increase() {
    i++;
}
2.2 修饰静态方法

当 synchronized 作用于静态方法时,其锁就是当前类的 class 对象锁。由于静态成员不专属于任何一个实例对象,是类成员,因此通过 class 对象锁可以控制静态成员的并发操作。需要注意的是如果一个线程 A 调用一个实例对象的非 static synchronized 方法,而线程 B 需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的 class 对象,而访问非静态 synchronized 方法占用的锁是当前实例对象锁,二者的锁并不一样,所以不冲突。

代码语言:javascript
复制
public static synchronized void increase() {
    i++;
}
2.3 修饰代码块

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

我们可以使用如下几种对象来作为锁的对象:

成员锁

锁的对象是变量

代码语言:javascript
复制
public Object synMethod(Object a1) {
    synchronized(a1) {
        // 操作
    }
}
实例对象锁

this 代表当前实例

代码语言:javascript
复制
synchronized(this) {
    for (int j = 0; j < 100; j++) {
        i++;
    }
}
当前类的 class 对象锁
代码语言:javascript
复制
synchronized(AccountingSync.class) {
    for (int j = 0; j < 100; j++) {
        i++;
    }
}

3. 什么是可重入锁

含义

所谓可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。(同一个加锁线程自己调用自己不会发生死锁情况)

意义

防止死锁。

实现原理

通过为每个锁关联一个请求计数和一个占有它的线程。当计数为 0 时,认为锁是未被占有的。线程请求一个未被占有的锁时,jvm 将记录锁的占有者,并且将请求计数器置为 1 。如果同一个线程再次请求这个锁,计数将递增;每次占用线程退出同步块,计数器值将递减。直到计数器为0,锁被释放。

应用

synchronized 和 ReentrantLock 都是可重入锁。

ReentrantLock 表现为 API 层面的互斥锁(lock() 和 unlock() 方法配合 try/finally 语句块来完成),synchronized 表现为原生语法层面的互斥锁。


4. 互斥同步的缺点

互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,因此这种同步也被称为阻塞同步。而且加锁方式属于悲观锁(不管操作是否成功都加锁)。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • synchronized(修饰方法和代码块)
    • 1. 含义
      • 2. 用法
        • 2.1 修饰实例方法
        • 2.2 修饰静态方法
        • 2.3 修饰代码块
      • 3. 什么是可重入锁
        • 4. 互斥同步的缺点
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档