Java中的锁机制是实现多线程同步的重要手段之一。在Java中,可以将锁加在方法或代码块上,以控制多个线程对共享资源的访问。
1. 锁加在方法上:
在Java中,可以使用synchronized关键字将锁加在方法上。当一个线程进入被synchronized修饰的方法时,它会尝试获取该方法所属对象的锁,如果锁没有被其他线程占用,则该线程可以执行方法体中的代码。如果锁已经被其他线程占用,那么该线程就会被阻塞,直到获取到锁为止。
`java
public synchronized void method() {
// 代码逻辑
在上述代码中,synchronized关键字将锁加在了method()方法上。这意味着在同一时刻,只能有一个线程执行该方法。其他线程必须等待当前线程执行完毕并释放锁之后,才能继续执行该方法。
2. 锁加在代码块上:
除了将锁加在方法上,还可以将锁加在代码块上。使用synchronized关键字可以创建一个同步代码块,将锁加在该代码块上。与锁加在方法上类似,当一个线程进入同步代码块时,它会尝试获取该代码块所属对象的锁。
`java
public void method() {
synchronized (this) {
// 代码逻辑
}
在上述代码中,synchronized关键字将锁加在了代码块中的this对象上。这意味着在同一时刻,只能有一个线程执行该代码块。其他线程必须等待当前线程执行完毕并释放锁之后,才能继续执行该代码块。
锁加在方法和代码块上的选择取决于具体的需求。如果需要同步整个方法,可以选择将锁加在方法上;如果只需要同步方法中的一部分代码块,可以选择将锁加在代码块上。还可以使用不同的对象作为锁,以实现更细粒度的同步控制。
- 锁加在方法和代码块上都可以实现多线程同步。
- 锁加在方法上会锁住整个方法,而锁加在代码块上只会锁住代码块内的部分代码。
- 锁加在方法和代码块上都是使用synchronized关键字来实现的。