这个疑问其实困扰我很久了。
假定有一个对象C ,线程A使用了synchronized“锁住”了这个对象,那么其他线程比如B还能对C进行操作吗?
这不是面试题,在实际项目中,经常会用加锁来表示一个原子操作,但是要尽可能的少用锁,我在优化的时候,遇到了这个情景。
一直以来没有写过测试例子来验证,以前都是只要需要加锁的对象,所有操作都去加锁,今天得空,验证一下。
我直接在单元测试里写的这个例子:
public class ExampleUnitTest {
//共享变量
private Entity entity = new Entity();
@Test
public void testSync(){
Thread thread_a= new Thread_A();
Thread thread_b = new Thread_B();
thread_a.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread_b.start();
try {
thread_a.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class Thread_A extends Thread{
public void run(){
synchronized (entity){
System.out.println("A_print:locked");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A_print:"+entity.count);
}
}
}
class Thread_B extends Thread{
public void run(){
entity.count = 5;
System.out.println("B_print:"+entity.count);
}
}
class Entity{
int count = 0;
}
}
最终测试打印结果如下:
A_print:locked
B_print:5
A_print:5
Process finished with exit code 0
由此可见:即便已经对一个对象使用了synchronized,但是其他线程仍然可以访问,并不影响,所以对于需要加锁的对象,应该结合业务,是否需要优化了。