synchronized可以有下面的两种格式1.用于方法声明中的
public synchronixed void addCount(){
count = count + 1;
}2.直接在代码段中加入
public synchronized void addCount(){
synchronized(this){
count = count + 1;
}
}
请问这两种方式,有什么不同啊?
public synchronixed void addCount(){
count = count + 1;
}2.直接在代码段中加入
public synchronized void addCount(){
synchronized(this){
count = count + 1;
}
}
请问这两种方式,有什么不同啊?
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同时执行。基于以上讨论,我认为一楼的说法是正确的。这两个效果是一样的。
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。 这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下: synchronized(syncObject)
{
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
同步方法(参照当前对象,执行此方法时将为此对象加锁,以至于此方法退出前其他标有此关键词的此对象方法将被阻塞)
synchronized(Object)
同步代码块(参照Object,为this时则为参照当前对象,其他与上述无异)