java.lang.Thread本身是一个线程安全的类吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.lang.Thread本身是一个线程安全的类吗?相关的知识,希望对你有一定的参考价值。
我想知道我们是否需要外部同步来使用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();
}
}
答案
是的它应该已经是线程安全的。您可以查看Thread.java here的源代码,所有重要的方法,如启动等都是同步的。
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);
}
以上是关于java.lang.Thread本身是一个线程安全的类吗?的主要内容,如果未能解决你的问题,请参考以下文章
Java 线程--继承java.lang.Thread类实现线程