关于java多线程中synchronized锁住的对象的问题


在一个synchronized块中锁的是this对象,另一个synchronized块中锁的是this对象中的一个属性,为什么这两个synchronized块是异步执行的呢
如果当前拿到了this的锁,在其他线程中拿到了this的属性的锁,并对这个属性进行了修改,那岂不是就是对this对象作出了修改?


class Service {
    private String anyString = new String();

    public void a() throws InterruptedException {
        synchronized (anyString) {
            System.out.println("a begin");
            Thread.sleep(3000);
            System.out.println("a end");
        }
    }

    public void b() {
        synchronized (this) {
            System.out.println("b begin");
            System.out.println("b end");
        }
    }
}

class ThreadA implements Runnable {

    private Service service;

    public ThreadA(Service service) {
        this.service = service;
    } @Override public void run() {
        try {
            service.a();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class ThreadB implements Runnable {
    private Service service;

    public ThreadB(Service service) {
        this.service = service;
    } @Override public void run() {
        service.b();
    }
}

public class Main {
    public static void main(String[] args) {
        Service service = new Service();
        new Thread(new ThreadA(service)).start();
        new Thread(new ThreadB(service)).start();
    }
}
最终输出结果:

我认为应该是:
a begin
a end
b begin
b end


求大佬解答!!!

#Java##笔试题目#
全部评论
synchronized的作用是取得当前对象的锁,不是说其他线程就不能访问当前对象了,而是其他线程就不能再获得当前对象的锁了,而this和它的属性分别都有一个锁,所以分别可以被两个线程获得,不会冲突。
点赞
送花
回复
分享
发布于 2019-08-22 10:06
你看一下 synchronize 的实现吧。。。每个对象都有一堆 monitor 对象负责锁。你这方法 a,b 锁的是不同的对象,当然是异步实现啦。
点赞
送花
回复
分享
发布于 2019-08-22 10:09
秋招专场
校招火热招聘中
官网直投
对象锁锁住的是synchronized修饰的代码块或者方法,注意这其中是锁不住对象里的属性的,所以会出现LZ实验的情况。 如果你把synchronized放在方法上,那么a方法和b方法就是互斥的,因为对象锁会把这两个方法都锁住。 个人理解,有不对之处还请指正
点赞
送花
回复
分享
发布于 2019-08-22 11:00
synchronized的实际是锁monitor对象,锁同一个monitor才会互斥,你的描述里是两把不同的“锁”。
点赞
送花
回复
分享
发布于 2019-08-22 11:04
老哥你这锁的是两个对象啦,一个是类本身的对象,一个是你那字符串的对象啦
点赞
送花
回复
分享
发布于 2019-08-22 11:11
可以把两个monitor的owner打出来看看。你就会明白了。
点赞
送花
回复
分享
发布于 2019-08-22 13:51

相关推荐

#简历#先说一说我自己的想法,很多人都很排斥苍穹外卖,认为没什么技术点和含金量,但实际上我觉得恰恰相反,苍穹外卖虽然代码本身并不是你自身能力的证明,但是是作为一个新人学习时很好的跳板和原始框架,在这个框架上进行的改进可以很好的辐射到你自己的个人成果上,并作为你和面试官聊天的筹码大多数人的苍穹外卖只写增删改查,千篇一律,吸引不了面试官,所以这才让大家误以为只要是苍穹外卖就不要写进简历里这种误区,但实际上如果你在原有的层面上进行改进,并作为你的项目亮点和面试官介绍,告诉他你的苍穹外卖和别人的有什么不同,增加了哪些技术难点,这才显得你是完全自己理解了这个项目,并且有自己动手实践项目的能力,而不是就看了个课程就以为自己会了,就当成自己的了,如此一来,这反而成为你的加分项苍穹外卖为什么看的人最多,说明它好啊,如果它不好,为什么看的人还这么多,想清楚这个逻辑,我觉得要做的最重要的事,就是如何在原有框架上进行改进提效,比起听其他人的话重新搞一个项目性价比高得多,而且我亲测项目并没有成为我找到工作的阻碍,我投的大厂一大半都给我面试了,而且很多不止一个部门,退一万步说,当你手头没有其他项目的时候,有苍穹外卖总比什么都没有的好很多,不需要因为苍穹外卖有任何心理负担关于简历的任何部分都欢迎大家提意见,十分感谢大家,祝大家找实习+秋招顺利上岸,offer拿到手软#简历中的项目经历要怎么写##我的上岸简历长这样##最后再改一次简历##简历##简历被挂麻了,求建议#
点赞 评论 收藏
转发
点赞 7 评论
分享
牛客网
牛客企业服务