导致线程安全的问题在于,存在多个线程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){}
    }
}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐