je thread-safety tester pour mieux comprendre ce qui est ce que je faisais:verrouillage de l'objet ne fonctionne pas pour la discussion de sécurité
J'ai un type appelé ThreadSample
qui a deux méthodes et ce où le verrouillage se produit:
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);
}
}
Fondamentalement, l'idée est quand doSomething()
est appelée, elle doit verrouiller les objets entiers et d'autres threads peuvent même invoquer anotherLife
méthode car ils attendent des autres threads pour libérer le verrou.
C'est la logique pour simuler le bouton de déblocage:
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");
}
}
Comme vous pouvez le voir dans le code ci-dessous à droite:
Lorsque Form
est en cours d'initialisation, une nouvelle Thread
et ThreadSample
sont créés. Ensuite, lorsque l'utilisateur clique sur le button1
, le thread est démarré et l'UIThread atteint et appelle anotherLife
qui n'est pas sûr pour les threads au premier abord.
Quoi qu'il en soit, la sortie est:
- Il y a deux MessageBox montré en même temps.
Ce que je me attendais est quand le nouveau thread appelle doSomething()
, il obtient le verrou de l'objet et UIThread
attend que le verrou soit relâché pour pouvoir invoquer la méthode anotherLife
.
Quelqu'un peut-il expliquer pourquoi?
Merci.
Pourquoi avez-vous la balise java quand il s'agit clairement de C#? Et pourquoi utilisez-vous les conventions de nommage Java en C#? –
La façon dont j'ai lu votre question, il semble que vous avez une idée incorrecte sur le fonctionnement des verrous. Un verrou sur un objet n'est qu'un jeton à synchroniser. Rien n'arrive à l'objet de verrouillage lui-même. –
Peut-être que le tag Java fait référence aux conventions plutôt qu'à la langue? –