请问关于synchronized的两种格式的不同

Sodino 2009-07-12 08:31:19
synchronized可以有下面的两种格式

1.用于方法声明中的
public synchronixed void addCount(){
count = count + 1;
}

2.直接在代码段中加入
public synchronized void addCount(){
synchronized(this){
count = count + 1;
}
}


请问这两种方式,有什么不同啊?
...全文
73 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdgaq 2009-07-15
  • 打赏
  • 举报
回复
个人觉的应该是作用域不同。
dinghun8leech 2009-07-13
  • 打赏
  • 举报
回复
少说一句,同步代码块的作用域在synchronized{}中,可以自由定制,进入时加锁,执行完后去锁,其他同对象的synchronized{} 或synchronized()将会有一个从阻塞状态转为执行状态。
dinghun8leech 2009-07-13
  • 打赏
  • 举报
回复
public synchronized void xxxFunction()
同步方法(参照当前对象,执行此方法时将为此对象加锁,以至于此方法退出前其他标有此关键词的此对象方法将被阻塞)
synchronized(Object)
同步代码块(参照Object,为this时则为参照当前对象,其他与上述无异)
sbje36 2009-07-12
  • 打赏
  • 举报
回复
2楼的说的没错,当用synchronized修饰方法时,它会对所有引用对象加锁,而采用synchronized块时,只对块中引用对象加锁,另外,也可看出两者在加锁时的时效
yihanmushui5211314 2009-07-12
  • 打赏
  • 举报
回复
方法声明中加入 synchronized关键字
  public synchronized void accessVal(int newVal);
  
   synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。

  这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。

2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:

  synchronized(syncObject)
  {
   //允许访问控制的代码
  }

  
  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
islandrabbit 2009-07-12
  • 打赏
  • 举报
回复
Java 其实提供三种 synchronized

Synchronized 类方法:

class class_name {
static synchronized type method_name() {
statement block
}
}


以上这个方法中的代码段是同步的,那个锁是类对象。

Synchronized 实例方法:


class class_name {
synchronized type method_name() {
statement block
}
}


以上这个实例方法中的代码段是同步的,那个锁是这个类的一个实例。

Synchronized 代码段:

class class_name {
type method_name() {
synchronized (object) {
statement block
}
}
}


以上加粗的代码段是同步的,那个锁是那个 object

举例来说, 以下代码有两个同步代码段,用的却是同一把锁:这个类的一个实例 this


class class_name {
type method_name() {
synchronized (this) {
statement block 1
}
}
synchronized type method_name() {
statement block 2
}
}

所以代码段1永远不会和代码段2同时执行。

基于以上讨论,我认为一楼的说法是正确的。这两个效果是一样的。

wenzheng38 2009-07-12
  • 打赏
  • 举报
回复
作用域的范围不同。。。
rumlee 2009-07-12
  • 打赏
  • 举报
回复
这两个效果是一样的,直接写synchronized相当于synchronized(this)。
closewbq 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wenzheng38 的回复:]
作用域的范围不同。。。
[/Quote]
主要就是这个意思
xucan2087 2009-07-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sportli 的回复:]
作用差不多,
第一种是锁定方法,针对所有对象,即任何一个对象执行该方法必须等待该方法空闲。
第二种是针对引用对象对代码块加锁。
[/Quote]老师说的也是这样
xiewei_26 2009-07-12
  • 打赏
  • 举报
回复
一个是对当强对象上锁 一个是对方法上锁 作用域不同!
sportli 2009-07-12
  • 打赏
  • 举报
回复
作用差不多,
第一种是锁定方法,针对所有对象,即任何一个对象执行该方法必须等待该方法空闲。
第二种是针对引用对象对代码块加锁。

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧