这段代码中内部类inner的对象锁起到的作用?
代码如下
package synchron;
public class Thread3 {
class Inner {
private void m4t1() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
private void m4t2() {
int i = 5;
while(i-- > 0) {
System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i);
try {
Thread.sleep(500);
} catch(InterruptedException ie) {
}
}
}
}
private void m4t1(Inner inner) {
synchronized(inner) { //使用对象锁
inner.m4t1();
}
}
private void m4t2(Inner inner) {
inner.m4t2();
}
public static void main(String[] args) {
final Thread3 myt3 = new Thread3();
final Inner inner = myt3.new Inner();
Thread t1 = new Thread( new Runnable() {public void run() { myt3.m4t1(inner);} }, "t1");
Thread t2 = new Thread( new Runnable() {public void run() { myt3.m4t2(inner);} }, "t2");
t1.start();
t2.start();
}
}
输出如下
t1 : Inner.m4t1()=4
t2 : Inner.m4t2()=4
t1 : Inner.m4t1()=3
t2 : Inner.m4t2()=3
t1 : Inner.m4t1()=2
t2 : Inner.m4t2()=2
t1 : Inner.m4t1()=1
t2 : Inner.m4t2()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=0
对于在m4t1
中的对象锁,我不是很理解, 传入m4t1(),m4t2()
的是同一个inner对象,m4t1
已经将对象inner
锁住, 为什么t2
还可以访问m4t2
呢? 希望可以有大神详细解释一下, 谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
因为synchronized锁的是inner对象,m4t2没去synchronized(inner)所以也不会去试图遵守锁的规则
你把
m4t2
方法改成这样这个inner锁才起效果。
因为你现在的
m4t2
方法是不需要拿锁就可以执行的,锁起的作用是保证对需要拿锁才能执行的代码在多线程执行的时候能保证顺序,对于不需要拿锁就可以执行的代码是不受限制的。这里跟inner 没有关系 因为 t2访问Thread3的m4t2方法不是一个 synchronized 方法 所以不需要获得inner对象的锁,所以不会进入锁队列 所以很自由 是一个单独的个体
锁对象和对象实例在堆中不是在一起的,锁对象在“对象头”中。