导致线程安全的问题在于,存在多个线程2同时操作一个共享资源,需要解决这个问题,就需要保证对共享资源访问的独占性,因此人们在Java中提供了synchronized关键字,我们称之为同步锁,它可以保证在同一时刻,只允许一个线程执行某个方法或代码块。
synchronized同步锁具有互斥性,这相当于线程由并行执行变成串行执行,保证了线程的安全性,但损失了性能。
synchronized的使用方法
- 作用在方法级别,表示针对m1()方法加锁,当多个线程同时访问m1()方法时,同一时刻只有一个线程能执行。
public synchronized void m1(){}
- 作用在代码块级别,表示针对某一段线程不安全的代码加锁,只有访问到synchronized(this)这行代码时,才会去竞争锁资源。
public void m2(){
synchronized(this){}
}
synchronized同步锁的作用范围
- 类锁:类锁是全局锁,当多个线程调用不同对象实例的同步方法时会产生互斥。
/**修饰静态方法*/ public static synchronized void m1(){} /**修饰代码块,synchronized中的锁对象是类,也就是Lock.class*/ public class Lock{ public void m2(){ synchronized(Lock.calss){ } } }
- 对象锁:对象锁是实例锁,当多个线程调用同一个对象实例的同步方法时会产生互斥。
//修饰普通方法
public synchronized void m1(){}
//修饰代码块,synchronized中的锁对象是普通对象实例
public class Lock{
Object lock = new Object();
public void m2(){
synchronized(lock){}
}
}