多线程之后,就是锁的问题了

针对不同对象玩多线程,肯定可以。

那针对相同对象呢?

即,相同的对象在不同线程的执行过程中,交替、先后甚至不确定顺序的被引用和执行,如何实现所谓的原子、事务?

锁。


在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
作者
Younger
许可协议