文章分类 -  线程与并发

java基础
摘要:Queue的子接口,阻塞的队列,增加了两个线程状态为无限期等待的方法: 常用方法: void put(E e);将指定元素插入队列,如果没有可用空间,则等待。 E take();获取并移除该队列头部元素,如果没有,则等待。 使用场景 可用于解决生产者、消费者问题。 实现类 1、ArrayBlocki 阅读全文
posted @ 2022-12-30 05:26 Amireux-126 阅读(21) 评论(0) 推荐(0) 编辑
摘要:线程安全、可高效读写的队列,高并发下性能最好的队列。底层采用链表。 无锁、才用了CAS比较交换算法,修改的方法包含三个核心参数(V,E,N) V:要更新的值;E:预期值;N:新值。 只有当V==E时,V=N。否则表示已经被更新过,则取消当前操作。 代码演示 public static void ma 阅读全文
posted @ 2022-12-30 04:37 Amireux-126 阅读(4) 评论(0) 推荐(0) 编辑
摘要:Collection的子接口,标识队列FIFO(First In First Out),先进先出。 常用方法 抛出异常: boolean add(E e);顺序添加一个元素。(达到上限后,再添加会抛出异常) E remove(); 获取第一个元素并移除(如果队列中没有元素时,则抛出异常) E ele 阅读全文
posted @ 2022-12-29 02:59 Amireux-126 阅读(16) 评论(0) 推荐(0) 编辑
摘要:List: CopyOnWriteArrayList: 线程安全的ArrayList,加强版的读写分离。适用于读多写少的场景。斜入式加锁,读取时不加锁,读写之间不阻塞,优于读写锁。 在有写操作的时候会先将ArrayList复制出来一份,更新新的ArrayList,之后将原本的ArrayList引用指 阅读全文
posted @ 2022-12-29 02:45 Amireux-126 阅读(7) 评论(0) 推荐(0) 编辑
摘要:ReentrantReadWriteLock: 一种支持一写多读的同步锁,读写分离,可分别分配读锁和写锁。 支持多次分配读锁,使多个读操作可以并发执行。 互斥规则 两个线程都是写操作:互斥,阻塞。 一读一写操作:读阻塞写,写阻塞读。 两个线程都是读操作:不互斥、不阻塞。 在读操作多于写操作的环境下, 阅读全文
posted @ 2022-12-29 01:59 Amireux-126 阅读(6) 评论(0) 推荐(0) 编辑
摘要:可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁 实现原理 可重入锁通过内部维护一个线程标识,用来标识被哪一个线程占有,然后关联一个计数器。 已开始计数器为0,表示没有被占用。当一个线程获得锁时,计数器就会+1,这时其他线程来获取锁时,发现锁的持有者不是自己,就会进入阻塞状态。 当获 阅读全文
posted @ 2022-12-29 01:37 Amireux-126 阅读(12) 评论(0) 推荐(0) 编辑
摘要:用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。 阅读全文
posted @ 2022-12-29 00:59 Amireux-126 阅读(8) 评论(0) 推荐(0) 编辑
摘要:Future:表示将要完成任务的结果。表示ExecutorService.submit()所返回的状态结果。也就是call()的返回值。Future.get()方法,以阻塞的形式等待Future中的异步处理结果(call()的返回值)。 使用两个线程,并发计算1-50,51-100的和,在进行汇总统 阅读全文
posted @ 2022-12-29 00:53 Amireux-126 阅读(19) 评论(0) 推荐(0) 编辑
摘要:public static void main(String[] args) throws ExecutionException, InterruptedException { //创建一个定长线程池 ExecutorService executorService = Executors.newFi 阅读全文
posted @ 2022-12-29 00:38 Amireux-126 阅读(3) 评论(0) 推荐(0) 编辑
摘要:同:都代表一个线程任务。 异: 1、Callable有返回值,Runnable没有返回值。 2、Callable可以声明异常,Runnable不能声明异常。 阅读全文
posted @ 2022-12-29 00:10 Amireux-126 阅读(19) 评论(0) 推荐(0) 编辑
摘要:什么是线程池? 1、线程池是一个线程容器,可以设置线程分配的数量上限。 2、将预先创建的线程对象放入线程池,并重用线程池中的线程对象。 3、避免频繁的创建和销毁线程。 为什么使用线程池? 1、线程是宝贵的内存资源,单个线程约占1MB空间,过多分配容易造成内存溢出。 2、频繁的创建、销毁线程会增加虚拟 阅读全文
posted @ 2022-12-28 03:52 Amireux-126 阅读(14) 评论(0) 推荐(1) 编辑
摘要:1、等待。 public final void wait() public final void wait(long timeout) 注: 必须在对obj加锁的同步代码块中。 在一个线程中,调用obj.wait()方法,此时线程会释放气所拥有的所有的锁标记,并且放弃CPU的使用权,进入等待队列中。 阅读全文
posted @ 2022-12-27 20:32 Amireux-126 阅读(19) 评论(0) 推荐(0) 编辑
摘要:死锁:当第一个线程拥有对象A锁标记,等待对象B锁标记,同时第二个线程拥有对象B锁标记,并等待对象A锁标记时,产生死锁。 一个线程可以同时拥有多个对象的锁标记,当线程阻塞时,不会释放已拥有的锁标记,由此可能造成死锁。 代码示例: //定义A、B两把锁 private static Object loc 阅读全文
posted @ 2022-12-27 03:19 Amireux-126 阅读(5) 评论(0) 推荐(0) 编辑
摘要:1、同步代码块。 synchronized(共享资源对象){//对共享资源对象加锁 //代码(原子操作) } 注: 每个对象都有一个互斥锁标记,用来分配给线程的。 只有拥有对象互斥锁标记的线程,才可以进入该对象加锁的同步代码块。 线程退出同步代码块时,会释放相应的互斥锁标记。 代码示例: //当前数 阅读全文
posted @ 2022-12-27 03:05 Amireux-126 阅读(155) 评论(0) 推荐(0) 编辑
摘要:多个线程操作同一个共享变量时,可能会造成数据不一致的情况,这个就是线程的安全问题。 代码演示: //当前数组下标值 private static int INDEX = 0; public static void main(String[] args) throws InterruptedExcep 阅读全文
posted @ 2022-12-27 02:31 Amireux-126 阅读(4) 评论(0) 推荐(0) 编辑
摘要:1、线程休眠(Sleep)。 public static void main(String[] args) throws InterruptedException { //线程开始时先打印当前时间 System.out.println(LocalDateTime.now()); for (int i 阅读全文
posted @ 2022-12-21 00:44 Amireux-126 阅读(15) 评论(0) 推荐(0) 编辑
摘要:1、初始状态(New)。 线程对象被创建,即为初始状态。只在堆中开辟内存,与常规对象无异。 2、就绪状态(Ready)。 调用start()方法后,线程就进去了就绪状态。等待操作系统选择,并分配时间片。 3、运行状态(Running)。 获得时间片之后,进入运行状态,如果时间片到期,则返回就绪状态, 阅读全文
posted @ 2022-12-19 02:07 Amireux-126 阅读(144) 评论(0) 推荐(0) 编辑
摘要:一、继承Thread类,重写run方法。 //继承Thread类,并重写run方法 public class TextThread extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { //打印当 阅读全文
posted @ 2022-12-19 01:10 Amireux-126 阅读(2) 评论(0) 推荐(0) 编辑
摘要:什么是进程? 进程是系统中正在运行的一个程序,程序一旦运行就是进程,是系统进行资源分配的基本单位。目前操作系统都可以支持多进程,可以同时执行多个进程,使用进程ID区分。单核CPU在同一时刻只能运行一个进程;宏观并行,微观串行。 什么是线程? 线程,又称为轻量级进程(Light Weight Proc 阅读全文
posted @ 2022-12-19 00:18 Amireux-126 阅读(5) 评论(0) 推荐(0) 编辑