验证多个线程访问一个对象,其中m1加synchronized,m2不加,其他线程可否在m1被访问时访问m2?
/**
* 验证多个线程访问一个对象,其中m1加synchronized,m2不加,其他线程可否在m1被访问时访问m2?
*/
public class SynchronizedMethodTest {
public static void main(String[] args) {
Obj obj = new Obj();
new Thread(obj::m1,"T1").start();
new Thread(obj::m2,"T2").start();
}
}
class Obj {
public synchronized void m1() {
System.out.println(Thread.currentThread().getName()+"m1 start ..... ");
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"m1 end ..... ");
}
public void m2() {
System.out.println(Thread.currentThread().getName()+"m2 start ..... ");
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"m2 end ..... ");
}
}
输出
T1m1 start .....
T2m2 start .....
T2m2 end .....
T1m1 end .....
结论:不会影响
生产中存在脏读(dirtyRead);
如:写(m1)加锁,读(m2)不加锁