线程同步的方法主要包括以下几种:
同步方法:
使用`synchronized`关键字修饰方法,可以保护整个方法,使其在同一时刻只能被一个线程访问。
```java
public synchronized void saveValue(int dex) {
index += dex;
}
```
同步代码块:
使用`synchronized`关键字修饰的代码块,可以保护特定的代码段,使其在同一时刻只能被一个线程访问。
```java
public void saveValue(int dex) {
synchronized (this) {
index += dex;
}
}
```
使用`volatile`关键字:
`volatile`关键字为域变量的访问提供了一种免锁机制,确保变量的可见性,防止指令重排序。
```java
private volatile int index = 10;
```
使用`ReentrantLock`:
`ReentrantLock`提供了比`synchronized`更灵活的线程同步机制,支持公平锁和非公平锁,以及可中断的锁获取操作。
```java
private Lock lock = new ReentrantLock();
public int getAccount() {
lock.lock();
try {
return account;
} finally {
lock.unlock();
}
}
```
使用`wait()`, `notify()`, `notifyAll()`:
这些是Java中的内置方法,用于线程间的协作和通信。`wait()`使线程等待,释放锁;`notify()`唤醒一个等待的线程;`notifyAll()`唤醒所有等待的线程。
```java
synchronized (lock) {
while (!condition) {
lock.wait();
}
// 执行操作
lock.notifyAll();
}
```
使用条件变量(Condition):
与`ReentrantLock`一起使用,允许线程在特定条件下等待和唤醒。
```java
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public void doSomething() throws InterruptedException {
lock.lock();
try {
while (!condition.await(10, TimeUnit.SECONDS)) {
// 等待条件满足
}
// 执行操作
condition.signalAll();
} finally {
lock.unlock();
}
}
```
以上方法均可用于确保线程安全,防止数据不一致和竞态条件。选择合适的同步方法取决于具体的应用场景和性能需求