关于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

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
点赞 7 评论
分享
牛客网
牛客企业服务