landiaozhuyi 2014-11-26 14:30
浏览 420
已采纳

JAVA里synchronized同步代码块的一点疑问

代码如下:

[code="java"]
public class SomeObj {
public void print(int i){
System.out.println(Thread.currentThread().getName()+DateHelper.getNow()+ " " + i);
try {
wait(1000);
} catch (InterruptedException e) {
e.printStackTrace();

}
}
}
public
class ThreadA extends Thread{
private SyncTest st;
public ThreadA(SyncTest syncTest){
this.st=syncTest;
}

public void run(){
st.methodA();
}
}
public class SyncTest {
private volatile int i;

public static void main(String[] args) throws Exception {
    new SyncTest().startUp();
}

public void startUp(){
    for (int a = 0; a < 10; a++) {
        new ThreadA(this).start();
    }
}

private  SomeObj obj = new SomeObj();

public void methodA() {
    synchronized (obj) {
       obj.print(i);

System.out.println(Thread.currentThread().getName()+DateHelper.getNow() + " god is a girl");
i++;

    }
}

}

[/code]

    synchronized (obj) {  运行结果显示,同步代码块并没有被锁住,而把这行代码的obj替换成this或者随便其他的instance对象,都能锁住代码块。求解?
  • 写回答

1条回答 默认 最新

  • kilobug 2014-11-26 16:12
    关注

    因为wait(1000)会将当前对象obj的控制权(即锁)交出去1秒
    可以用Thread.sleep(1000)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集