2015-02-14 5 views
0

У меня есть класс:Как заблокировать 2 разных метода одного и того же класса за одно и то же время?

public class petri { 
    public int[] nodes = new int[3]; 
    public void petri (int n) { 
     this.nodes[1] = n; 
     this.nodes[2] = 0; 
     this.nodes[3] = 0; 
    } 

    public bool start() { 
     if (this.nodes[1] != 0) { 
      this.nodes[1]--; 
      this.nodes[2]++; 
      return true; 
     } else 
      return false; 
    } 

    public bool end() { 
     if (this.nodes[2] != 0) { 
      this.nodes[2]--; 
      this.nodes[3]++; 
      return true; 
     } else 
      return false; 
    } 
} 

Я использую этот класс из параллельных потоков, и нужно сделать так: начать() и конец() functuions должен использоваться только 1 нить в 1 раз. Я имею в виду, если thread1 начала вызова(), thread2 Weit до tread1 конца выполнения пуска() и до этого thread2 нельзя назвать начать() и конец()

ответ

1

Добавить поле объекта к объекту, чтобы привязываться и заблокировать этот объект в каждом методе, который вы хотите заблокировать вместе:

public class petri { 
    private readonly object _lock = new object(); 

    public bool start() { 
     lock(_lock) 
     { 
      // rest of method here 
     } 
    } 

    public bool end() { 
     lock(_lock) 
     { 
      // rest of method here 
     } 
    } 
} 
+0

Обратите внимание, что если вам требуется более одного замка, все становится более волосатым, и вы идете чтобы иметь дело с вещами, такими как порядок блокировки и эскалация блокировок (возможно). –

+0

О, джайс. Во всяком случае мне нужен только один замок, так что спасибо! – InfernumDeus

+0

BTW Это, скорее всего, приведет к запуску 'start' несколько раз, за ​​которым следует' end' несколько раз. – Aron

0

Используйте семафор или синхронизированный метод (монитор)

http://www.albahari.com/threading/part2.aspx

+0

Я использую C#. Не Java. – InfernumDeus

+0

Извините ... То же самое смотрите http://stackoverflow.com/questions/34519/what-is-a-semaphore –

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