多线程方法加锁后执行的过程
时间: 2024-04-16 17:03:55 浏览: 10
当一个线程进入一个加锁方法或代码块时,它会尝试获取锁。如果锁没有被其他线程持有,则该线程获取锁并且可以执行方法或代码块中的代码。如果锁已经被其他线程持有,则该线程会被阻塞,直到锁被释放为止。
当一个线程执行完加锁方法或代码块中的代码后,它会释放锁。此时,等待获取锁的其他线程中,优先级最高的线程会获取锁并执行方法或代码块中的代码,其他线程则仍然会处于阻塞状态。
需要注意的是,加锁的方法或代码块应该尽量保持锁的粒度小,以避免锁的竞争和死锁问题。同时,使用锁时还需要考虑锁的性质,如公平性、可重入性、可中断性等,以满足不同场景的需求。
相关问题
Java中单线程的优缺点,多线程的优缺点,多线程不加锁的优缺点,多线程加锁的优缺点
单线程的优点:
1. 程序编写简单,不需要考虑线程间的同步和通信问题。
2. 调试和排错比多线程更容易,因为程序的执行顺序是可预测的。
单线程的缺点:
1. 单线程不能充分利用多核 CPU 的优势,无法提高程序的运行效率。
2. 执行时间长的任务会阻塞程序的执行,导致程序响应变慢或出现“假死”现象。
多线程的优点:
1. 能够充分利用多核 CPU 的优势,提高程序的运行效率。
2. 能够同时处理多个任务,提高程序的响应速度。
多线程的缺点:
1. 线程间的同步和通信比较复杂,容易出现死锁、竞态条件等问题。
2. 线程的创建、销毁和切换需要消耗系统资源,如果线程过多,会导致系统负载过重。
多线程不加锁的优点:
1. 简化了程序的实现过程,减少了代码量。
2. 可以提高程序的运行效率,因为不需要进行锁的申请和释放。
多线程不加锁的缺点:
1. 可能会出现数据竞争,导致程序出现不可预期的错误。
2. 可能会出现数据不一致的情况,导致程序的正确性受到影响。
多线程加锁的优点:
1. 可以保证程序的正确性,避免数据竞争和数据不一致的情况。
2. 能够确保共享资源的互斥访问,避免多个线程同时修改同一个共享资源。
多线程加锁的缺点:
1. 会降低程序的运行效率,因为加锁和释放锁需要消耗一定的系统资源。
2. 如果加锁的粒度过大,会导致线程争用锁的情况较多,从而影响程序的性能。
用stream流创建一个线程并且加锁
可以使用Java中的`java.util.concurrent.locks`包中的`ReentrantLock`类来实现加锁。具体实现如下:
```java
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Stream;
public class Main {
private static final ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
Stream.of("A", "B", "C", "D", "E")
.forEach(s -> new Thread(() -> {
lock.lock();
try {
System.out.println("Thread " + s + " is running");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}).start());
}
}
```
在上面的代码中,我们使用`Stream`创建了五个线程。每个线程都会获取`lock`对象的锁,并在获取到锁之后打印一条信息并睡眠1秒钟,模拟线程运行的过程。在执行完毕之后,线程会释放锁。这样做可以保证线程之间的互斥性,避免了多个线程同时访问共享资源的情况。