举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > java显示锁和隐式锁 Java 显式锁

java显示锁和隐式锁 Java 显式锁

2023-03-13 03:18 Java教程

java显示锁和隐式锁 Java 显式锁

java显示锁和隐式锁

Java显示锁是指在Java中使用synchronized关键字来实现的锁,它是一种显式的、可重入的互斥锁。当一个线程获得了一个对象上的显式锁时,其他线程就不能再访问这个对象上的同步代码块,直到这个锁被释放。

隐式锁是指在Java中使用内部机制来实现的锁,它是一种隐式的、可重入的互斥锁。当一个方法被调用时,JVM会在方法执行前后加上隐式锁,从而保证多个线程之间不会同时执行这个方法。

public synchronized void method(){ 
    //do something 
}

Java 显式锁

Java线程教程 - Java显式锁


显式锁定机制可以用于协调对多线程环境中的共享资源的访问。

在java.util.concurrent.locks包中声明的Lock接口定义了显式锁定操作。

ReentrantLock类在同一个包中,是Lock接口的具体实现。

Lock接口声明如下:

public interface Lock {
  void lock();

  Condition newCondition();

  void lockInterruptibly() throws InterruptedException;

  boolean tryLock();

  boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

  void unlock();
}

lock()方法获取一个锁的行为与使用synchronized关键字相同。

我们必须在完成锁定后通过调用Lock接口的unlock()方法释放锁定。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Main {
  // Instantiate the lock object
  private Lock myLock = new ReentrantLock();

  public void updateResource() {

    try {
      // Acquire the lock
      myLock.lock();
    } finally {
      // Release the lock
      myLock.unlock();
    }
  }
}

例子

下面的代码模拟哲学家,假设ReentrantLock类的一个对象表示一个fork。

import java.util.concurrent.locks.Lock;

class Philosopher {
  private Lock leftFork;
  private Lock rightFork;
  private String name; // Philosopher"s name

  public Philosopher(Lock leftFork, Lock rightFork, String name) {
    this.leftFork = leftFork;
    this.rightFork = rightFork;
    this.name = name;
  }

  public void think() {
    System.out.println(name + "  is thinking...");
  }

  public void eat() {
    if (leftFork.tryLock()) {
      try {
        if (rightFork.tryLock()) {
          try {
            System.out.println(name + "  is eating...");
          } finally {
            rightFork.unlock();
          }
        }
      } finally {
        leftFork.unlock();
      }
    }
  }
}

例2

ReentrantReadWriteLock类是ReadWriteLock接口的实现。只有一个线程可以保持ReentrantReadWriteLock的写锁,而多个线程可以保持其读锁。

下面的代码演示了ReentrantReadWriteLock的用法。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Main {
  private int value;
  private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
  private Lock rLock = rwLock.readLock();
  private Lock wLock = rwLock.writeLock();

  public Main(int value) {
    this.value = value;
  }

  public int getValue() {
    rLock.lock();
    try {
      return this.value;
    } finally {
      rLock.unlock();
    }
  }

  public void setValue(int value) {
    wLock.lock();
    try {
      this.value = value;
    } finally {
      wLock.unlock();
    }
  }
}
阅读全文
以上是编程学为你收集整理的java显示锁和隐式锁 Java 显式锁全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部