当前位置: 首页 > 知识库问答 >
问题:

线程如何能够访问应该是块的同步块?

曹恩
2023-03-14

我写了下面的Java程序。这个程序正在创建三个线程,并将它们全部启动:

public class MyThread implements Runnable {

    @Override
    public synchronized void run() {

        int count = 0;
        while (true) {                

                System.out.println("" + Thread.currentThread().getName());

                if (count == 20 && Thread.currentThread().getName().equals("Thread-1")) {
                    try {                        
                        Thread.currentThread().sleep(100000000);                        
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                count++;
            }//while ennds here
    }//run ends here
}//class ends here


public class TestThread {

    public static void main(String[] args){

        Thread t1 = new Thread(new MyThread());
        t1.setName("Thread 1");
        Thread t2 = new Thread(new MyThread());
        t1.setName("Thread 2");
        Thread t3 = new Thread(new MyThread());
        t1.setName("Thread 3");        

        t1.start();
        t2.start();
        t3.start();
    }

}

第二个线程在一段时间后进入Hibernate状态。

有人能解释一下这里发生了什么吗?根据Hibernate的概念,在“线程1”进入Hibernate后,执行应该处于暂停状态。

共有1个答案

陆琦
2023-03-14

您的synchronized位于实例方法上。只有在同一个实例上调用该方法时,它才会synchronized。你不能那么做。您在3个不同的实例上调用run()方法。

 类似资料:
  • 问题内容: 我正在阅读同步工作。这是示例: 让假定有两个线程和正在访问的方法,如果线程是块则线程将跳过该块,执行下一个块/语句或将等待/阻塞,直到线程离开 块。 第二是什么,为什么在参数中以及什么时候可以 下面是真的吗? 内在锁在对象上: 如果线程A在其中,则无法输入或任何其他同步方法。 问题答案: 1:线程B将等待,直到线程A释放对同步对象的锁定之后,线程A将释放对同步对象的锁定并执行代码。 2

  • 我在读同步工作。下面是一个例子: 假设两个线程 和 正在访问 方法,如果线程 位于块中,则线程 将跳过该块并执行下一个块/语句,或者将等待/阻止,直到线程 离开块。 第二,什么是< code>synchronized参数中的< code>Singleton.class以及它何时可以为< code>null 下面的<code>语句 内部锁位于对象上: 如果线程A位于中,则无法输入或任何其他同步方法。

  • 问题内容: 随着的发布,我一直在尝试一些新的API,其中之一是。 我注意到警告之一是针对。 这是警告: 并给出了在UI线程上进行的调用。 是否应该真正从UI线程进行访问和更改? 问题答案: 很高兴您已经在玩它! 注意事项:( 以懒惰的子弹形式) 如果这是您遇到的最严重的问题,则您的应用程序可能是个不错的选择。:)写操作通常比读操作慢,因此请确保使用的是SharedPreferenced $ Edi

  • 问题内容: 假设我有一个与field共享的对象。多个线程将共享对该对象的引用以访问该字段。但是,线程永远不会同时访问对象。我需要声明为volatile吗? 这样的情况如下: 一个类定义一个唯一字段和一个方法。 一个线程使计数器递增,然后生成另一个使计数器递增的线程,依此类推。 鉴于程序的逻辑,因此无法并发访问计数器。但是,计数器是在多个线程之间共享的。计数器必须波动吗? 的情况的另一个变体是当多个

  • 线程可以等待,直到其他线程释放访问同步块的锁。我想知道当其他线程访问同步块时,一个线程可以等待多长时间?什么时候它会知道另一个线程释放了锁?

  • 问题内容: 我的Java应用程序使用两个线程。从历史上看,有同步方法和专用锁对象在使用。我需要知道当前线程是否具有锁,以及它是按方法还是按对象。我怎样才能做到这一点? 问题答案: 输入同步方法时,VM会在当前对象上设置锁定。因此,以下代码具有相同的效果: 这意味着同步方法与 您代码中的任何地方。 您可以用来检查线程是否持有特定的锁。这是示例代码: 从Java 1.5开始,该软件包支持诸如Reent

  • 方法有一个有趣的属性,它将允许其他线程在被阻止时进入其同步块。例如(假设线程1首先运行): 线程1: 线程2: 线程 2 能够唤醒线程 1 的事实意味着线程 2 进入了同步块,即使其他某个线程位于同一对象的同步块中也是如此。这对我来说很好,但我想知道这是否只发生在或所有会使线程“等待”的方法()上。在我的情况下,我关心,因为如果行为与相同,它会破坏我的代码: 那么,多个线程是否可能因为join调用