java.lang.Thread本身是一个线程安全的类吗?

时间:2012-02-19 04:34:07

标签: java thread-safety

我想知道我们是否需要外部同步来使用java.lang.Thread中的方法?

例如,我们可以从任何主题调用方法t1.isAlive(),而无需外部同步,并期望它返回:

  

如果t1已经启动,则为true,否则为false。

或是调用java.lang.Thread中的方法需要外部同步吗?

public static void main(String args[]) {
        final java.lang.Thread t1 = new java.lang.Thread(new java.lang.Runnable() {

            @Override
            public void run() {
                while(true){
                    //task
                }
            }
        });
        java.lang.Thread t2 = new java.lang.Thread(new java.lang.Runnable() {

            @Override
            public void run() {
                while (true) {
                    System.out.println(t1.isAlive()); // do we need synchronization before calling isAlive() ?
                }
            }
        });
        t2.start();
        t1.start();
        try {
            java.lang.Thread.sleep(1000000);
        } catch (java.lang.InterruptedException e) {
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:4)

是的,它应该已经是线程安全的。您可以查看Thread.java here的源代码,所有重要的方法(如start等)都是同步的。

is_Alive是在较低层实现的本机方法,因此将立即给出关于线程是否已启动的答案,它不会同步,因此在调用start方法后它可能会给出错误。虽然这是非常罕见的。

然而, start方法会在继续其操作之前检查threadStatus成员变量,这是一个volatile int,即将在所有访问线程中立即更新。因此,您可以使用getState调用来检查线程是否已启动而不是isAlive方法,以避免调用启动两次。我在下面复制了Thread.java的相关部分。

/* Java thread status for tools,
 * initialized to indicate thread 'not yet started'
 */

private volatile int threadStatus = 0;

...

public synchronized void start() {
    /**
     * This method is not invoked for the main method thread or "system"
     * group threads created/set up by the VM. Any new functionality added
     * to this method in the future may have to also be added to the VM.
     *
     * A zero status value corresponds to state "NEW".
     */
    if (threadStatus != 0)
        throw new IllegalThreadStateException();
....

public State getState() {
    // get current thread state
    return sun.misc.VM.toThreadState(threadStatus);
}