指标:理解synchronized的含义、明确synchronized关键字修饰普通方法、静态方法和码块时锁对象的差异
1:方法内的变量是线程私有的,不存在同步问题
2:明确概念,需要使用synchronized说明是需要数据共享
3:脏读概念?即线程不安全造成的数组被覆盖出错等脏数据问题
4:多线程单对象,即多个线程操作单个对象的的实例变量,需要使用synchronized来进行数据同步
5:多线程多对象非静态,异步执行,因为锁的是对象,锁不同,不构成同步机制,算异步执行
6:多线程多对象静态,锁的是类,构成同步机制,需要数据同步
classA{
public synchronized void a(){
}
public synchronized void b(){
}
}
然后创建两个对象
A a1 =newA();A a2 =newA();
然后在两个线程中并发访问如下代码
Thread1 Thread2
a1.a(); a2.a();
请问二者能否构成线程同步?
问题二:如果A的定义是下面这种呢?
classA{
public static synchronized void a(){
}
public static synchronized void b(){
}
}
解答一:不构成同步,这属于多线程多对象的问题,取得的锁的对象锁,a1对象锁和a2对象锁,2把锁不同,异步执行,不需要做线程的数据同步
解答二:构成同步,这也是多线程多对象的问题,但是因为是静态方法,因此加的锁的类锁,类锁可以对类的所有对象实例起作用,因此a1和a2取的锁的一把锁,构成同步;