21xrx.com
2024-12-23 17:34:14 Monday
登录
文章检索 我的文章 写文章
Java中的锁类型及其使用案例
2023-06-15 14:34:49 深夜i     --     --
Java锁 synchronized锁 ReentrantLock ReadWriteLock

在Java中,锁用于控制对共享资源的访问。Java提供了多种锁类型,每种锁都有其特定的使用场景和适用范围。

1. synchronized锁

synchronized锁是Java中最常见的一种锁。它可以将代码块或方法标记为同步代码块,保证同一时间只有一个线程可以访问这些代码。下面是一个使用synchronized锁的案例:

public class SyncExample {

  private int count;

  public synchronized void increment() {

    count++;

  }

  public synchronized void decrement()

    count--;

  public synchronized int getCount()

    return count;

}

在这个例子中,increment(),decrement()和getCount()方法都被标记为同步方法,通过synchronized关键字保证了count变量这个共享资源在同一时间只有一个线程可以访问。

2. ReentrantLock

ReentrantLock是Java中另一种常用的锁类型。它提供了对等待线程、可中断锁、公平锁等功能的支持。下面是一个使用ReentrantLock的案例:

public class LockExample {

  private final ReentrantLock lock = new ReentrantLock();

  private int count;

  public void increment() {

    lock.lock();

    try {

      count++;

    } finally {

      lock.unlock();

    }

  }

  public void decrement() {

    lock.lock();

    try

      count--;

     finally {

      lock.unlock();

    }

  }

  public int getCount() {

    lock.lock();

    try

      return count;

     finally {

      lock.unlock();

    }

  }

}

与synchronized不同的是,ReentrantLock需要手动获取和释放锁,并且提供了更多的锁功能。

3. ReadWriteLock

ReadWriteLock是Java中的另一种锁类型,它分为读锁和写锁。读锁可以被多个线程同时持有,但是在写锁被持有时,读锁和写锁都不可访问。下面是一个使用ReadWriteLock的案例:

public class ReadWriteLockExample {

  private final ReadWriteLock lock = new ReentrantReadWriteLock();

  private final List data = new ArrayList<>();

  public void write(String item) {

    lock.writeLock().lock();

    try {

      data.add(item);

    } finally {

      lock.writeLock().unlock();

    }

  }

  public String read(int index) {

    lock.readLock().lock();

    try {

      return data.get(index);

    } finally {

      lock.readLock().unlock();

    }

  }

}

在这个例子中,write()方法获取写锁,而read()方法获取读锁,确保了读操作和写操作的互斥性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复