스레드로부터의 안전성을 위해 작동하지 않으며 이것은 내가 무슨 짓을 :개체 잠금은 내가 더 잘 이해하기위한 스레드 안전성을 테스트했다
내가 가지고 두 가지 방법이있다 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
을 호출합니다.
어쨌든, 출력은 :
- 동시에 도시 개의 메시지 박스가있다.
은 내가 기대 한 것은 새로운 스레드가 doSomething()
를 호출 할 때, 그것은 anotherLife
메소드를 호출 할 수 있도록 출시 될 물체와 잠금 UIThread
대기의 잠금을 얻을 수있다.
이유를 설명 할 수 있습니까?
감사합니다.
분명히 C# 일 때 자바 태그를 얻은 이유는 무엇입니까? 왜 C#에서 Java 명명 규칙을 사용하고 있습니까? –
귀하의 질문을 읽는 방법, 당신은 자물쇠가 작동하는 방법에 대한 몇 가지 잘못된 생각이 들리는 것 같습니다. 객체에 대한 잠금은 동기화 할 토큰에 불과합니다. 잠금 객체 자체에는 아무런 변화가 없습니다. –
Java 태그가 언어가 아닌 규칙을 참조 할 수 있습니까? –