synchronized关键字
Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。
synchronized 方法
如果声明了一个方法时,在前面加上关键字synchronized,那么这个方法就每次只能由一个线程运行。这种方法称为synchronized方法,有时也称为同步方法。
public synchronized void run(){
}
synchronized 代码块
如果只是想让方法中的某一部分由一个线程运行,而非整个方法,则可使用synchronized代码块,格式如下。
synchronized(对象){
}
下面两个是等效的。
public synchronized void run(){
}
public void run(){
synchronized (this) {
}
}
synchronized 静态方法每次也只能由一个线程运行,但是加锁的方法有所不同。
下面两个是等效的。
class A{
public static synchronized void run(){
}
}
class A{
public static void run(){
synchronized (A.class) {
}
}
}
总结
synchronized的核心还是synchronized代码块中锁住的对象。对象的锁只能同时被一个线程获得,对象锁被锁住的是对象本身,类锁锁住的是对象的class对象。所以下面代码中的2个方法可以同时执行。
class A{
public void run1(){
synchronized (this) {
}
}
public static void run2(){
synchronized (A.class) {
}
}
}
小tips
当前线程是否已获得某一对象的锁可以通过Thread.holdsLock(Object)方法来确定。
本文详细介绍了Java中的synchronized关键字,用于实现线程同步,防止数据不一致。synchronized可应用于方法和代码块,确保同一时刻仅有一个线程执行特定代码。同步方法通过在方法前加上synchronized关键字实现,而同步代码块则允许更细粒度的锁控制。此外,同步静态方法的锁对象为类的Class对象,而非实例对象。线程是否持有对象锁可使用Thread.holdsLock(Object)进行检查。
970

被折叠的 条评论
为什么被折叠?



