文章目录
synchronized底层原理
一. synchronized的使用
- synchronized的使用一般出现在三个地方:
- 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
- 修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
- 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁
1.1 synchronized修饰实例方法
- 修饰实例方法即一个类中有多个实例方法(A,B,C),synchronized可对类中的实例方法进行修饰,如下所示:synchronized 关键字修饰 increase()方法
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();
}}
}
- 注意: 如果创建多个不同类实例的线程t1,t2,此时t1和t2可以同时访问被synchronized修饰的实例方法。如图下所示:创建了两个不同类实例的线程t1,t2
- 这种情况下,t1和t2可以同时获取到increase()的锁,因为我们创建了两个不同的实例锁,t1和t2获取的是不同实例锁。
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(new AccountingSync());
Thread t2=new Thread(new AccountingSync());
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(i);
}
正确用法:
- 应创建线程时使用同一实例进行创建,这时候t1和t2就会进行increase()的锁竞争。而不会同步执行。
public static void main(String