线程A锁住了对象,其他线程还能操作对象吗

这个疑问其实困扰我很久了。

假定有一个对象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,但是其他线程仍然可以访问,并不影响,所以对于需要加锁的对象,应该结合业务,是否需要优化了。

转载于:https://my.oschina.net/tnjin/blog/756019

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值