2014-04-15 35 views
2

我注意到一些框架在嘗試從主線程之外的其他線程訪問對象或屬性時會拋出異常。跨線程訪問異常:如何實現?

如果我的對象(或對象中的某個方法)是從不同於創建它的線程訪問的,則檢測並拋出異常的方法是什麼。有一個線索「擁有」一個對象的概念嗎?

+1

框架拋出什麼樣的異常,哪些是框架? – avijendr

+0

你想實現跨線程異常嗎? –

回答

0

您可以使用線程本地數據來執行此操作。該框架在主線程上插入線程局部變量。當你調用框架時,它會查看線程局部變量是否存在。如果沒有,則會拋出異常。

看看ThreadLocal的類或this tutorial

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); 
     } 
    } 
} 

編輯:但是你真的想要解決什麼問題?關於線程的一個基本事實是它們都在相同的地址空間中運行,並且它們都有相同的數據訪問權限。爲什麼你關心哪個線程「擁有」給定的對象?當一個線程訪問一個沒有「擁有」的對象時,這個異常應該是什麼意思?

+0

該類的某些屬性不是線程安全的,而其他屬性是。嘗試從不同線程訪問線程不安全的屬性應該會引發異常。 – Monstieur

+0

這聽起來像是互斥的用例。這聽起來不像是你應該測試「所有權」的原因。如果某個線程A不需要使用某個對象O,那麼它就不會使用_try_來訪問線程O.其他任何設計都是不好的。 –