关于线程ID有个问题想确认

来源:8-2 线程ID

MarcoLhc

2020-05-13

是不是在一个进程的生命周期内,不会有两个不同的线程拥有相同ID。
比如A线程的ID是1,然后A线程销毁了。新建了一个B线程ID又是1?
虽然自己代码验证了不会,但还是想确认一下。
因为我想依赖ID和AtomicReferenceFieldUpdater改进老师另外一门课中实现的SpinLock,感觉ID会不会重复影响很大。

package threadcoreknowledge.atomic;

import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

/**

  • 通过AtomicReference实现的自旋锁
    */
    public class SpinLock {

    private volatile boolean interrupted;
    private volatile Long curThreadId;
    private static final AtomicReferenceFieldUpdater<SpinLock, Long> sign = AtomicReferenceFieldUpdater.newUpdater(SpinLock.class, Long.class, “curThreadId”);

    public void lock() {
    Thread cur = Thread.currentThread();
    while (!sign.compareAndSet(this, null, cur.getId())) {
    //没有获得锁,自旋等待
    }
    System.out.println(“获得锁的线程Id:” + cur.getId() + " 名字:" + cur.getName());
    }

    public void unlock() {
    Thread cur = Thread.currentThread();
    sign.compareAndSet(this, cur.getId(), null);
    }

    public boolean tryLock() throws InterruptedException {
    Thread cur = Thread.currentThread();
    while (!sign.compareAndSet(this, null, cur.getId())) {
    //没有获得锁,自旋等待
    if (interrupted) {
    throw new InterruptedException();
    }
    }
    return true;
    }

    public void interrupt() {
    this.interrupted = true;
    }

    public boolean tryLock(long time) throws InterruptedException {
    long startTime = System.currentTimeMillis();
    Thread cur = Thread.currentThread();
    while (!sign.compareAndSet(this, null, cur.getId())) {
    //没有获得锁,自旋等待
    if (interrupted) {
    //处理中断
    throw new InterruptedException();
    }
    long diff = System.currentTimeMillis() - startTime;
    if (diff >= time) {
    //处理超时
    System.out.println(“超时:” + diff + “ms”);
    return false;
    }
    }
    return true;
    }
    }

写回答

1回答

悟空

2020-05-13

是的,一个进程的生命周期内线程ID不会重复,就算销毁了,再建线程,也是一样,因为id是自增的,是线程的唯一标识。

0
2
悟空
回复
转行干测试
JDK类可以具有许多不同的实现。您查看了的实现Thread,发现它永远不会重复使用线程ID。但的Javadoc仅仅是说,一个线程ID 可能它的终止后可重复使用,也就是说,一个JDK实现可重用终止线程的线程ID。
2020-07-22
共2条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程