1
3
在已经给出的其他优秀答案中没有提到的一件事是code1和code2之间的区别。在code1中,同步在找到代码的对象的实例上,在code2中,同步在对象内的特定锁对象上。 如果封闭类中只有两个同步块,则没有 功能性 两者之间的区别,但请考虑: class CodeOneClass { ... synchronized(this) { // or merely "synchronized" - it defaults to this first protected code block } ... synchronized(this) { second protected code block } ... } class CodeTwoClass { ... Object lock1 = new Object(); synchronized(lock1) { first protected code block } ... Object lock2 = new Object(); synchronized(lock2) { second protected code block } ... } 如果两个线程试图使用同一个codeoneClass实例,则只能在 两个受保护的代码块之一 同时。 但是对于第二个习惯用法,您可以灵活地说,一个线程位于第一个受保护的块中,另一个线程位于另一个受保护的块中是安全的。注意,如果锁是相同的(都在同一个锁对象上同步),则行为将与第一个相同。 还有其他的区别。一些作家开始指出 已同步(此) -我会给你指出另一个帖子: Avoid synchronized(this) in Java? 我强烈推荐阅读它,以及它链接到的三篇文章。 |
2
6
基本上,Java中的每个对象都有一个“锁”。 当一个线程调用synchronized(某物)时,它必须在继续之前获取某物的锁。如果一次只允许一个线程修改一个对象的状态,最明显的是在该对象的锁上进行同步。如果允许并行调用不同的方法,则需要使用不同的锁。 如果您编写synchronized(this),或者只是synchronized,则线程必须获取与当前对象(调用该对象的方法)关联的锁。 注意,自从Java 5,并发包提供了适当的 locks 可以用来代替同步。 |
3
3
将代码放入
所以,如果线程2在
同时,如果线程1到达
最终的结果是只有一个
|
4
2
假设你有一个
现在假设你有一个余额为100欧元的账户,你有两次尝试借70欧元。如果两个借项同时发生,您可以得到 种族状况 这样地:
我们可以通过同步
这样可以确保对帐户余额和借方的测试不会被对帐户余额的另一个测试中断。 这个 Sun Java tutorial 是了解并发性和锁定信息的好地方。 |
Khyxes · Java监视器中的同步方法 7 年前 |
pathikrit · Scala部分函数应用语义+同步锁定 8 年前 |
user2514421 · 多线程 8 年前 |
G Vaid · 同步对象:锁定代码与锁定对象 8 年前 |
hermit · 显示奇怪结果的同步块 9 年前 |
Raj · 如何使构造函数同步? 10 年前 |