Я тестирование потокобезопасности для лучшего схватывания, и это то, что я сделал:замок Объект не работает ниточный
У меня есть тип называется ThreadSample
, который имеет два метода, и это, где блокировка происходит:
internal class ThreadTime
{
public void doSomething(string message)
{
lock (this)
{
DialogResult t = MessageBox.Show(message);
Thread.Sleep(2000);
}
}
public void anotherLife(string message)
{
MessageBox.Show("This is coming from anotherLife method and and current threadNumber is " + message);
}
}
в принципе идея заключается в том, когда doSomething()
называется, он должен блокировать целые объекты и другие потоки могут даже вызывать anotherLife
метод, так как они ждут другие потоки, чтобы освободить фиксатор.
Это логика для имитации блокировки-релиз:
public partial class Form1 : Form
{
private ThreadTime time;
private Thread thread;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
thread = new Thread(new ThreadStart(workerThread));
time = new ThreadTime();
}
private void button1_Click(object sender, EventArgs e)
{
thread.Start();
//Thread.Sleep(1000);
time.anotherLife("Current thread is = " + "UI Thread");
}
private void workerThread()
{
//time.doSomething("Current thread is = " + Thread.CurrentThread.ManagedThreadId);
time.doSomething("Worker Thread");
}
}
Как вы можете видеть в коде прямо ниже:
Когда Form
инициализируется новый Thread
и ThreadSample
созданы. Затем, когда пользователь нажимает на button1
, начинается поток, и UIThread достигает и вызывает anotherLife
, который сначала не является потокобезопасным.
В любом случае, выход:
- Есть два MessageBox показано, в то же самое время.
То, что я ожидал, когда новая тема вызывает doSomething()
, он получает блокировку объекта и UIThread
ждет замок, чтобы быть освобожден, чтобы иметь возможность ссылаться на anotherLife
метод.
Может кто-нибудь объяснить, почему?
Спасибо.
Почему у вас есть тег java, когда это явно C#? И почему вы используете соглашения об именах Java в C#? – 2010-12-09 17:55:18
То, как я читаю ваш вопрос, похоже, что у вас есть некорректная идея о том, как работают замки. Блокировка объекта - это всего лишь токен для синхронизации. Ничего не происходит с самим объектом блокировки. – 2010-12-09 17:57:23