sdslnmd 2010-12-23 17:32
浏览 281
已采纳

同一个实例中的两个不同的同步方法。是否可以被两个线程同时访问。

理论上 synchronized 是持有的对象级的锁。那么就应该在thread1执行完task.out()后,休眠5s后thread2才可以执行 task.print()。
为什么我在运行这段代码时同时出来了结果?

如果我的代码是错误的。请给出正确的代码。谢谢。

public class Run {

public static void main(String[] args) {

    final Task task = new Task();

    Thread thread1 = new Thread(new Runnable() {

        public void run() {

            task.out();
            try {

                Thread currentThread = Thread.currentThread();
                currentThread.sleep(5000);


            } catch (InterruptedException e) {
                e.printStackTrace();
            }


        }
    }, "thread1");

    Thread thread2 = new Thread(new Runnable() {

        public void run() {

            task.print();

        }
    }, "thread2");

    thread1.start();
    thread2.start();

}

}

package thread;

public class Task {

public synchronized void out() {


        String name1 = "method   out()" + Thread.currentThread().getName();

        System.out.println(name1);
}

public synchronized void print() {


        String name1 = "method print()" + Thread.currentThread().getName();
        System.out.println(name1);
}

}

  • 写回答

1条回答 默认 最新

  • ethenjean 2010-12-24 09:34
    关注

    我觉得你应该好好看看线程的东西。这个问题就是锁的问题。
    thread1.start();
    thread2.start();
    这两句话呢是启动了两个线程,然后线程1调用out,线程2调用print。如果一个线程阻塞在那里,肯定是在等待锁。但是你的out方法执行结束之后,就把锁释放掉了,所以线程2也就执行了。这时候可能线程1还在等待,直到5秒结束。如果想要达到你想要的效果,就不应该在线程1里面执行sleep,而是应该在out方法里执行sleep,因为这样才能使线程1一直占有锁。

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

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置