温馨提示:这篇文章已超过287天没有更新,请注意相关的内容是否还可用!
Java中的锁是一种用于多线程编程的机制,它可以确保在同一时间只有一个线程可以访问被锁定的代码块或资源。锁的使用可以避免多个线程同时访问共享资源而导致的数据不一致或竞争条件的问题。
Java提供了多种类型的锁,其中最常用的是synchronized关键字和ReentrantLock类。这两种锁都可以用来实现互斥访问,即同一时间只有一个线程可以执行被锁定的代码块。
示例代码如下所示,首先是使用synchronized关键字的示例:
public class MyRunnable implements Runnable {
private int count = 0;
public void run() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
count++;
System.out.println(Thread.currentThread().getName() + ": " + count);
}
}
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread1 = new Thread(myRunnable);
Thread thread2 = new Thread(myRunnable);
thread1.start();
thread2.start();
}
}
在上面的示例中,MyRunnable类实现了Runnable接口,并且在run方法中使用了synchronized关键字来锁定代码块。当多个线程同时运行时,只有一个线程可以进入synchronized代码块,保证了count变量的原子性操作。
另一种常用的锁是ReentrantLock类,它提供了更灵活的锁定机制。示例代码如下所示:
public class MyRunnable implements Runnable {
private int count = 0;
private ReentrantLock lock = new ReentrantLock();
public void run() {
lock.lock();
try {
for (int i = 0; i < 5; i++) {
count++;
System.out.println(Thread.currentThread().getName() + ": " + count);
}
} finally {
lock.unlock();
}
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread1 = new Thread(myRunnable);
Thread thread2 = new Thread(myRunnable);
thread1.start();
thread2.start();
}
}
在上面的示例中,MyRunnable类中使用了ReentrantLock类的实例来进行锁定。在run方法中,首先通过lock方法获取锁,然后在try-finally块中执行需要锁定的代码块,最后在finally块中使用unlock方法释放锁。
无论是使用synchronized关键字还是ReentrantLock类,锁的作用是确保同一时间只有一个线程可以访问被锁定的代码块,从而避免了多线程并发访问的问题。