CodeGym /Java 课程 /Java 多线程 /互斥锁和监视器

互斥锁和监视器

Java 多线程
第 6 级 , 课程 6
可用

“嗨,阿米戈!”

“在我之前的课程中,我有时会使用‘互斥锁’和‘监控器’这两个词,现在是时候告诉你它们的意思了。”

“我洗耳恭听。”

互斥量是一个用于同步线程/进程的特殊对象。它有两种可能的状态:忙碌和空闲。简单来说,互斥量是一个布尔变量,可以有两个值:忙碌(真)和空闲(假)。”

“当一个线程想要获得一个对象的所有权时,它将对象的互斥量标记为忙碌。当它完成对对象的处理后,它将其互斥量标记为空闲。”

“换句话说,互斥量就像门上的‘忙碌/空闲’标志?”

“是的。而且这样的互斥量与 Java 中的每个对象相关联。只有 Java 机器才能直接访问互斥量。它对程序员是隐藏的。”

“那我们怎么用呢?”

“在 Java 中,我们可以通过监视器使用互斥量。”

“监视器是一种特殊的机制(一段代码),位于互斥量之上。它保证与互斥量的正确交互。将对象标记为忙碌是不够的。仍然有必要确保其他线程不会尝试使用忙碌的对象。”

“在 Java 中,监视器是使用关键字 synchronized 实现的。”

“当您编写同步块时,Java 编译器会用三段代码替换它:”

1)在 synchronized 块的开头,添加了将互斥量标记为繁忙的代码。

2) 在 synchronized 块的末尾,添加了将互斥量标记为空闲的代码。

3) 在同步块之前,添加代码,如果互斥锁忙,则导致线程等待直到互斥锁被释放。

“大致是这样的:”

代码 怎么运行的 描述
synchronized(object)
{

object.doJob();

}
while (object.mutex)
Thread.sleep(1);

object.mutex = true;

object.doJob();

object.mutex = false;

只要互斥体忙,线程就会休眠
(当互斥体被释放时我们退出循环)。 将互斥体标记为忙碌。

执行 doTask();

将互斥量标记为空闲

“实际上,那里的逻辑是不同的,而且更复杂。但这只是细节。”

“我可以知道详情吗?”

“在你学会如何正确使用它之前,没有必要纠结于细节。”

“在几个关卡之前,我给了你一个带有转换箭头的所有线程状态的列表和一个影响该状态的方法列表。你还记得很多吗?”

“不是真的。我只是很快就忘记了一切……”

“你做的练习越少,你从理论中获益就越少。”

“到 40 级时,你将学会如何使用所有这些,我将解释所有这些实际上是如何工作的。与此同时,只要学会正确使用它就可以了。明白了吗?”

“是的,谢谢你,艾莉。”

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION