Java中主类的两个内联线程属于同一个对象?

时间:2017-02-16 23:12:59

标签: java concurrency

在下面的代码中,线程t1和t2属于同一个对象吗?如是?哪个对象。他们会竞争获得监视器还是互斥锁?

如果它们属于不同的对象。怎么样?关于监视器的解释将是有用的。

package com.java.thread.practice;

public class InlineObject_SameThread {

    public static void main(String[] args) {

        Thread t1 = new Thread(new Runnable(){

            @Override
            public void run() {

            // Will this compete with thread t2 to acquire monitor ??   

            }

        });

        Thread t2 = new Thread(new Runnable(){

            @Override
            public void run() {

                // Will this compete with thread t1 to acquire monitor ??   

            }

        });

        // Starting the first thread.

        t1.start();

        // Starting the second thread.

        t2.start();

        /* There can be further logic, currently I will placing those as
         * we progress.
         */ 
    }

    /*
      Code ends.
    */

}

1 个答案:

答案 0 :(得分:0)

  

线程t1和t2是否属于同一个对象?

线程不属于对象,对象也不属于其他对象。对象可以将引用保存到其他对象,包括表示线程的Thread个对象。有点迂腐,引用也不属于对象 - 它们只是值。没有对象可以拥有引用,只能拥有值1.对象可以拥有存储引用的变量

  

他们会竞争获得监视器还是互斥锁?

尽管如此,线程并没有无理由地获取对象的监视器。在您的示例中,两个线程都不会执行任何会导致它尝试获取任何对象的监视器的操作。当然这样的线程可以做成让他们争用同一个监视器的工作,但这与他们称之为“内联”时没什么关系。

  

如果它们属于不同的对象。怎么样?关于监视器的解释将是有用的。

每个Thread对象代表一个线程,其存在基本上与创建线程的上下文无关。但是,只有main()可以引用任何一个。监视器没有任何解释,因为监视器根本没有考虑因素。

此外,main()中执行的代码与任何对象都没有关联,因为main()static。线程没有任何对象,除了它们自己。存在两个Runnable()实例,但没有理由断言Thread属于那些实例。如果有的话,你可能会说这是另一种方式。