哪位大神帮我解答一个synchronized的面试题

时间:2021-08-26 19:06:42


下面两种写法中为什么 写法1 的对象锁的使用效率高?


哪位大神帮我解答一个synchronized的面试题

哪位大神帮我解答一个synchronized的面试题

10 个解决方案

#1


我总觉得还有代码没贴全的样子

#2


我完全迷茫啊 帮你顶一下

#3


我理解是两个不同的方法对同一个对象进行操作用同一把锁不需要做释放锁和等待其他对象解锁并获取锁的过程,所以比较有效率

#4


synchronized 锁住的是对象。
不知道这个信息是否有帮助

#5


方法二不是会有线程安全问题?存在两个线程同时处理同一对象? 哪位大神帮我解答一个synchronized的面试题
个人理解,希望大神解惑

#6


楼主的意思是不是这样  ABCD 4个人去买票,A和B要买X票,C和D要买Y票  买一张票要5分钟

第一种方法就是 AB来到火车站X售票口买X票 排队等,同时CD来到火车站Y售票口买Y票 排队等,

第二种方法就是 AC来到火车站,A买X票 C买Y票,BD来了 不还得是去他们后面排队等

各个线程互不干扰 和先后顺序没关系

#7


说实话,我拿到这题,也蒙了。当时,我是这么写的,不知道对不对:

       实际应用中,一般情况下,o1,o2分别代表两个独占资源。o1在任何情况下,应只允许被一个线程进行访问;o2在任何情况下,也应只允许被一个线程进行访问,但o1、o2两者之间没有相互制约的关系,都可以同时被线程访问。写法1很好的做到了这一点。

反观写法2,有以下两个方面的不足:
1)o1资源有可能同时被两个线程访问,破坏了其独占性。
2)o1与o2资源在某些情况下,形成了相互制约的关系。如线程1要调用methodA去访问资源o1、而线程2要调用methodC去访问资源o2,这两个线程就不能同时进行。

#8


引用 7 楼 qq_29448025 的回复:
说实话,我拿到这题,也蒙了。当时,我是这么写的,不知道对不对:

       实际应用中,一般情况下,o1,o2分别代表两个独占资源。o1在任何情况下,应只允许被一个线程进行访问;o2在任何情况下,也应只允许被一个线程进行访问,但o1、o2两者之间没有相互制约的关系,都可以同时被线程访问。写法1很好的做到了这一点。

反观写法2,有以下两个方面的不足:
1)o1资源有可能同时被两个线程访问,破坏了其独占性。
2)o1与o2资源在某些情况下,形成了相互制约的关系。如线程1要调用methodA去访问资源o1、而线程2要调用methodC去访问资源o2,这两个线程就不能同时进行。


我觉得靠谱

#9


我当时想的,o1,o2若不是独占资源,那就没必要加锁了。也不知道这样想是不是出题人的意思。

#10


刚学的,我个人理解, 按图1中的代码顺序执行方法A,一个线程获取到了锁对象lock,这个对象的对象头会和当前线程关联会成为一个偏入锁,
当前线程在执行方法B的时候,由于lock对象是算偏入锁,不用cas指令就可直接进入方法B。
之后再执行方法C,和上面就是一个意思了
而图2中如果顺序执行A后再执行B,当前线程是需要获取锁对象再释放锁对象的,lock和lock2对象不能算偏入锁,导致在高并发的情况下,效率会低于图1的方式

#1


我总觉得还有代码没贴全的样子

#2


我完全迷茫啊 帮你顶一下

#3


我理解是两个不同的方法对同一个对象进行操作用同一把锁不需要做释放锁和等待其他对象解锁并获取锁的过程,所以比较有效率

#4


synchronized 锁住的是对象。
不知道这个信息是否有帮助

#5


方法二不是会有线程安全问题?存在两个线程同时处理同一对象? 哪位大神帮我解答一个synchronized的面试题
个人理解,希望大神解惑

#6


楼主的意思是不是这样  ABCD 4个人去买票,A和B要买X票,C和D要买Y票  买一张票要5分钟

第一种方法就是 AB来到火车站X售票口买X票 排队等,同时CD来到火车站Y售票口买Y票 排队等,

第二种方法就是 AC来到火车站,A买X票 C买Y票,BD来了 不还得是去他们后面排队等

各个线程互不干扰 和先后顺序没关系

#7


说实话,我拿到这题,也蒙了。当时,我是这么写的,不知道对不对:

       实际应用中,一般情况下,o1,o2分别代表两个独占资源。o1在任何情况下,应只允许被一个线程进行访问;o2在任何情况下,也应只允许被一个线程进行访问,但o1、o2两者之间没有相互制约的关系,都可以同时被线程访问。写法1很好的做到了这一点。

反观写法2,有以下两个方面的不足:
1)o1资源有可能同时被两个线程访问,破坏了其独占性。
2)o1与o2资源在某些情况下,形成了相互制约的关系。如线程1要调用methodA去访问资源o1、而线程2要调用methodC去访问资源o2,这两个线程就不能同时进行。

#8


引用 7 楼 qq_29448025 的回复:
说实话,我拿到这题,也蒙了。当时,我是这么写的,不知道对不对:

       实际应用中,一般情况下,o1,o2分别代表两个独占资源。o1在任何情况下,应只允许被一个线程进行访问;o2在任何情况下,也应只允许被一个线程进行访问,但o1、o2两者之间没有相互制约的关系,都可以同时被线程访问。写法1很好的做到了这一点。

反观写法2,有以下两个方面的不足:
1)o1资源有可能同时被两个线程访问,破坏了其独占性。
2)o1与o2资源在某些情况下,形成了相互制约的关系。如线程1要调用methodA去访问资源o1、而线程2要调用methodC去访问资源o2,这两个线程就不能同时进行。


我觉得靠谱

#9


我当时想的,o1,o2若不是独占资源,那就没必要加锁了。也不知道这样想是不是出题人的意思。

#10


刚学的,我个人理解, 按图1中的代码顺序执行方法A,一个线程获取到了锁对象lock,这个对象的对象头会和当前线程关联会成为一个偏入锁,
当前线程在执行方法B的时候,由于lock对象是算偏入锁,不用cas指令就可直接进入方法B。
之后再执行方法C,和上面就是一个意思了
而图2中如果顺序执行A后再执行B,当前线程是需要获取锁对象再释放锁对象的,lock和lock2对象不能算偏入锁,导致在高并发的情况下,效率会低于图1的方式