synchronized详解
多个线程执行对同一个Java对象访问时候,为了保证数据的有效性,通常会使用synchronized关键字,俗称多线程安全。
synchronized从语法上一共有三种语法,修饰静态方法,修饰实例方法,在方法中使用代码块。
从锁住的对象来看两种:锁住类和和实例对象。
锁住实例对象:无论多少个线程使用同一个实例对象,都需要排队。但是多个线程使用多个对象,就不用排队了。
锁住类:无论多少个对象,只要对象都是一个类,多个线程使用多个对象,依旧要排队。
注意:一定要检查对象是不是实例对象,局部/静态变量是无法锁住的。
使用同步代码块
synchronized (this) {}–对象锁
public void m1(){
synchronized (this) {
//这里的this锁住的是所在类的实例对象对象
...................;
}
}
//因为是对象锁。两个线程使用两个对象。就锁不住了。
Object obj = new Object(); synchronized(obj){…} 对象锁
Object lock1=new Object();//实例对象,不能是局部变量
public void m1