当一个方法或一个代码块被synchronized关键字修饰时,该方法或代码块会被称为“同步方法”或“同步代码块”。synchronized是Java中实现线程同步的一种基本机制,可用于保证多个线程并发访问共享数据时的安全性,防止数据的不一致或线程间的资源竞争。下面分别就方法和代码块的同步使用方式做详细介绍。
同步方法
被synchronized关键字修饰的方法被称为同步方法。它可以用于修饰实例方法或静态方法,具体使用方式如下:
1. 同步实例方法
当synchronized修饰的是实例方法时,表示同步实例方法,即在某一个时刻只允许一个线程访问对象的这个方法。以下是一个示例:
public class SynchronizedExample {
private int count = 0;
public synchronized void add() {
count++;
}
}
在上述例子中,add()方法被声明为synchronized,因此每个实例的add()方法同时只能被一个线程访问,防止多个线程同时对count属性进行修改导致数据不一致的问题。
2. 同步静态方法
当synchronized修饰的是静态方法时,表示同步静态方法,即在某一个时刻只允许一个线程访问该类的这个方法。以下是一个示例:
public class SynchronizedExample {
private static int count = 0;
public static synchronized void add() {
count++;
}
}
在上述例子中,add()方法被声明为synchronized,因此每个实例的add()方法同时只能被一个线程访问,防止多个线程同时对静态变量count属性进行修改导致数据不一致的问题。
同步代码块
除了同步方法,java中还提供了同步代码块的机制。同步代码块可以将之前直接加在方法上的锁细化到某一段代码中,从而提高并发性。具体的使用方式如下:
使用同步代码块时,需要指定一个锁对象,对于synchronized修饰的代码块来说,该对象的锁就是synchronized后面括号中的对象。如果多个线程在执行同步代码块之间,如果使用的是同一个锁对象,那么这些线程之间也是互斥的。以下是一个使用同步代码块的示例:
public class SynchronizedExample {
private final Object lock = new Object();
private int count = 0;
public void add() {
synchronized (lock) {
count++;
}
}
}
在上述例子中,使用synchronized括号中的对象lock作为锁对象,加锁范围为synchronized代码块,以此保证每个实例的add()方法同时只能被一个线程访问,防止多个线程同时对count属性进行修改导致数据不一致的问题。需要注意的是,同步代码块可以使用任意对象作为锁,不一定要和类或实例相关。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是synchronized关键字? - Python技术站