跨线程访问异常:如何实现?

时间:2014-04-15 14:36:46

标签: java multithreading thread-safety

我注意到当您尝试从与主线程不同的线程访问对象或属性时,某些框架会抛出异常。

如果我的对象(或我的对象中的方法)是从与创建它的对象不同的线程访问的,那么检测和抛出异常的合适方法是什么。有一些线程“拥有”一个对象吗?

2 个答案:

答案 0 :(得分:1)

没有。语言和库没有线程的概念"拥有"任何对象。你可以很容易地自己实现它:

class MyClass {
    final Thread owner;

    MyClass() {
        owner = Thread.currentThread();
    }

    void assertOwnership() {
        if (Thread.currentThread() != owner) {
            throw new RuntimeException("Current thread does not own: " + this);
        }
    }
}

编辑:但你真的想解决什么问题?关于线程的一个基本事实是它们都在相同的地址空间中运行,并且它们都可以相同地访问相同的数据。为什么你关心哪个线程"拥有"给定的对象?当一个线程访问它不拥有的对象时,应该表示什么异常?"

答案 1 :(得分:0)

您可以使用线程本地数据来强制执行此操作。框架在主线程上插入线程局部变量。当您调用框架时,它会查看线程局部变量是否存在。如果它没有,那么它会引发异常。

查看ThreadLocal类或this tutorial