概述
1. synchronized块必须给定一个在其上进行同步的对象,并且最合理的方式是,使用其方法正在调用的当前对象:synchronized(this),在这种方式中,如果获得了synchronized块上的锁,那么该对象其他的synchronized方法和临界区就不能被调用了。因此如果在this上同步,临界区的效果就会直接缩小在同步的范围内。
2.在另一个对象上同步。
有时候必须在另一个对象上同步,这样做必须确保所有相关的任务都是在同一个对象上同步的。
下面例子展示了两个任务同时进入同一个对象,只要这个对象上的方法是不同的锁。
3.例1:
package
jiangning.c21;
class
DualSync{
private
Object
syObject
=
new
SyncObject();
public
synchronized
void
f(){
//同步对象是DualSync,所以会有一个锁
for
(
int
i=0; i<5; i++){
System.
out
.println(
"f()"
);
Thread. yield();
}
}
public
void
g(){
synchronized
(
syObject
) {
//同步对象syObject,使用的是另一个锁。
for
(
int
i=0; i<5; i++){
System.
out
.println(
"g()"
);
Thread. yield();
}
}
}
}
public
class
SyncObject {
public
static
void
main(String[] args) {//创建的main线程用来调用g()
final
DualSync ds =
new
DualSync();
new
Thread(){//创建的Thread线程调用f()
public
void
run(){
ds.f();
}
}.start();
ds.g();
}
}
/**
g()
f()
f()
f()
f()
f()
g()
g()
g()
g()
*/
分析:因为锁的不同,所以两个方法可以同时进行,不会出现阻塞的现象。
最后
以上就是默默过客为你收集整理的(35)21.3.6 在其它对象上同步---Java编程思想之并发笔记的全部内容,希望文章能够帮你解决(35)21.3.6 在其它对象上同步---Java编程思想之并发笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复