为什么使用synchronized
在多线程中如果多个线程同时访问某一资源,会造成不可预计的结果。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块。
synchronized 什么时候是对象锁:
当synchronized 作用在非静态的方法时是对象锁
synchronized public void getName() { }
对象锁的特征:
1.同个对象在多个线程中去调用synchronized作用的代码块、方法时需要获取对象锁。一个对象的对象锁是唯一的,只有一个线程可以拿到,因此当有线程在执行synchronized的方法时,其他线程需要进入阻塞队列等待。
2.同个对象在多个线程中去调用不同的synchronized方法时也是需要等待。
我们来验证一下:
public class Test {
synchronized public void getMessage(){
for(int i = 0;i<10;i++){
System.out.println("线程:"+Thread.currentThread().getName()+","+i);
}
}
}
Test 类中有个synchronized 修饰的方法,方法体输出循环输出0到10,并打印当前线程的名称。
public class MyThread extends Thread{
static Test test = new Test();
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
test.getMessage();
}
}
我们继承Thread类,MyThread拥有一个静态的成员变量Test ,这样做事为了确保不同的线程执行run()的时候都是调用同一个Test对象