Java 并发编程系列- synchronized
前言
看这篇文章前,建议大家先看我前面的文章《Java 并发编程系列 1-基础知识》,
否则里面的相关知识看不懂,特别是并发编程相关的可见性、有序性,以及内存
模型 JMM 等。
在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执
行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),
同时我们还应该注意到 synchronized 另外一个重要的作用,synchronized 可保
证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完
全可以替代 Volatile 功能)。
synchronized 的三种应用方式
synchronized 关键字最主要有以下 3 种应用方式,下面分别介绍:
� 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的
锁;
� 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对
象的锁;
� 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得
给定对象的锁。
synchronized 作用于实例方法
所谓的实例对象锁就是用 synchronized 修饰实例对象中的实例方法,注意是实
例方法不包括静态方法,如下:
public class AccountingSync implements Runnable {
public class AccountingSync implements Runnable {
//共享资源(临界资源)
static int i = 0;
// synchronized 修饰实例方法
public synchronized void increase() {
i ++;
}
@Override
public void run() {
for(int j=0;j<1000000;j++){
increase();