ReentrantLock锁–可重入锁

ReentrantLock是Lock接口的实现类,它拥有和synchronized相同的并发性和内存语义,通常使用ReentrantLock锁进行安全控制。它可以实现显示加锁、释放锁。

ReentrantLock锁的实现步骤:

1
2
3
4
5
6
Lock lock = new ReentrantLock();
try{
lock.lock();//加锁操作
}finally{
lock.unlock();
}

线程的死锁

产生死锁的必要条件

1. 互斥条件:一个资源一次只能被一个进程使用。

2. 请求与保持条件:一个进程因请求资源而阻塞的时候,对已获得的资源保持不放。

3. 不剥夺条件:进程以及获得资源,在未使用完成前,不能强行剥夺。

4. 循环等待条件:若干进程之间形成头尾相接的循环等待资源关系。

阅读全文 »

同步方法和同步块(synchronized)

一、 同步方法

1. public synchronized void method(){}

synchronized方法控制对 “对象” 的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象锁才能执行。否则会导致阻塞。方法一旦执行,就独占该锁,直到该方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行。

2. 若将一个大方法申明为一个synchronized方法,将极大的影响效率。

阅读全文 »

线程的同步

当多个线程访问同一个对象的时候 (并发),并且某些线程还想修改这个对象,此时就需要线程同步。线程同步实质上是一种等待机制,多个需要访问此对象的线程进入这个对象的线程等待池,等前一个线程使用完毕,后一个线程才能开始访问。

线程同步的解决措施:锁机制

由于一个进程内的多个线程共享一块存储空间,为了保证数据的正确性,并发的同时加入锁机制synchronized,当一个线程获取到锁的时候,其他线程必须等待,使用和释放锁即可。

阅读全文 »

线程的优先级和守护线程

一、设置线程优先级:线程类对象.setPriority(int xxx);

1. 线程优先级范围:1~10。

2. 先设置线程优先级后启动线程。

3. 线程优先级高的说明被CPU调度的概率高,具体调度顺序还是靠CPU调度。

4. 获取线程优先级:

阅读全文 »

Lambda表达式

一、Lambda表达式意义:

  • 避免匿名内部类定义过多。

  • 可以让代码看起来更简洁。

  • 去掉一些没有意义的代码,只留下核心逻辑。

二、Lambda表达式只能创建函数式接口的对象。

函数式接口:只含有一个抽象方法的接口。

阅读全文 »

进程、线程与多线程

1. 进程(Process):程序的一次执行过程。

2. 线程(Thread):是操作系统能够进行运算调度的最小单位,是独立调度和分派的基本单位。一条线程指的是进程中一个单一顺序的控制流。

3. 多线程:多个线程并发执行。

阅读全文 »