常见方法
tryLock 付过获取锁失败是不会挂起等待的而是直接放弃等待
locklnterruptibly 设置等待锁的过程中是否会被异常中断
- 如果用户想自己实现锁, 就可以实现这个借口, 进一步开发 所以这个包的主要作用就是让用户实现一些自己定制的锁
[java.util.concurrent.locks](()
[](()Callable/Future/FutureTask- 使用Callable和FutureTask也可以创建线程 (创建的是带返回值的线程 借助这个线程可以得到结果)
[创建线程的几种方式](()
[](()Executors (ThreadPoolExcutor)- 线程池 主要用途就是避免频繁的创建和销毁线程
[为什么要引入线程池? 如何自己简单实现一个线程池?](()
[](()Semaphore信号量-
信号量本质就是一个计数器, 表示可用资源的个数 如果要申请资源 计数器就-1 § 释放资源计数器就+1 (V) (P和V *** 作是原子的)
-
类似一个停车场一样 来一辆车显示停车数目加一 走一辆 显示停车数目就减一
-
有一个叫二元信号量只有0和1俩个取值 这个信号量也可以当成是一个简单的锁
-
最大区别就是对于Synchronized来说,synchronize是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成
-
便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。
-
锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized
- 这个创建的线程就好比是一场赛跑一样 所有的选手都跑完了才会宣布比赛结束 等所有线程都结束才会认为这个执行结束
import java.util.concurrent.CountDownLatch;
/**
-
Created with IntelliJ IDEA.
-
Description: If you don’t work hard, you will a loser.
-
User: Listen-Y.
-
Date: 2020-08-05
-
Time: 17:45
*/
public class Demo1 {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(10);
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)