多线程之后,就是锁的问题了
针对不同对象玩多线程,肯定可以。
那针对相同对象呢?
即,相同的对象在不同线程的执行过程中,交替、先后甚至不确定顺序的被引用和执行,如何实现所谓的原子、事务?
锁。
在Java中,实现锁主要有以下几种方式:
synchronized关键字
synchronized可以用于方法或者代码块,它会在方法或代码块执行时锁定对象的监视器锁,确保同一时刻只有一个线程可以访问。
当一个线程进入synchronized修饰的方法或代码块时,它会自动获得锁,并在退出时释放锁。
public synchronized void method() {
// 代码...
}
public void anotherMethod() {
synchronized (this) {
// 代码...
}
}
java.util.concurrent.locks.Lock接口
Lock接口提供了比synchronized更灵活的锁操作,例如可重入锁、公平锁、尝试锁等。
ReentrantLock是Lock接口的一个实现,提供了与synchronized类似的功能,但是有更多的控制。
import java.util.concurrent.locks.ReentrantLock;
private final ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 代码...
} finally {
lock.unlock();
}
}
java.util.concurrent.locks.ReentrantReadWriteLock
ReentrantReadWriteLock提供了读写锁,允许多个线程同时读取共享资源,但是在写操作时是独占的。
读锁和写锁的使用可以提高并发性能,尤其是在读操作远多于写操作的场景下。
import java.util.concurrent.locks.ReentrantReadWriteLock;
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock readLock = rwLock.readLock();
private final Lock writeLock = rwLock.writeLock();
public void readMethod() {
readLock.lock();
try {
// 代码...
} finally {
readLock.unlock();
}
}
public void writeMethod() {
writeLock.lock();
try {
// 代码...
} finally {
writeLock.unlock();
}
}
java.util.concurrent.atomic.Atomic类
Atomic类提供了一些原子操作,可以在不使用锁的情况下实现线程安全的操作,如AtomicInteger、AtomicLong等。
这些类内部使用了Unsafe类的CAS(Compare and Swap)操作来保证原子性。
import java.util.concurrent.atomic.AtomicInteger;
private final AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
ThreadLocal变量
ThreadLocal提供了线程局部变量,每个线程都有自己的副本,因此在多线程环境下不需要锁就可以安全访问。
import java.lang.ThreadLocal;
private static final ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public void method() {
Integer value = threadLocal.get();
// 使用value...
threadLocal.set(value + 1);
}
多线程之后,就是锁的问题了
http://59.110.91.42:8090//archives/Lock