2014-04-15 1 views
2

Я заметил, что некоторые фреймворки генерируют исключение, когда вы пытаетесь получить доступ к объектам или свойствам из другого потока, кроме основного потока.Исключения для сквозного доступа: как реализовать?

Что является подходящим способом для обнаружения и исключения исключений, если к объекту (или к способу в моем объекте) обращаются из другого потока, кроме того, который его создал. Есть ли какое-то понятие о потоке, «владеющем» объектом?

+1

Какое исключение составляют рамки и которые являются этими структурами? – avijendr

+0

Вы хотите реализовать исключения кросс-потоков? –

ответ

0

Вы можете использовать локальные данные потока, чтобы обеспечить соблюдение этого. Структура вставляет локальную переменную потока в основной поток. Когда вы вызываете фреймворк, он видит, существует ли локальная переменная потока. Если это не так, это вызывает исключение.

Посмотрите на ThreadLocal класса или this tutorial

1

No. Язык и библиотеки не имеют понятия потоков «владеющие» любой объект. Вы можете реализовать это самостоятельно достаточно легко:

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. Все остальное - плохой дизайн. –

Смежные вопросы