![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
卖琴的
这个作者很懒,什么都没留下…
展开
-
浅谈Callable与Future
Callablejava5引入java.util.concurrent包,其中包含了locks包、atomic包、线程池(Executors)、阻塞队列(BlockingQueue)、Callable、Future等相关多线程解决方案。Callable的出现解决Runable没有返回值,无法抛出异常的问题。同时先线程池Executors 提供了许多方法,可以操控 Callable 在线程池中运行。FutureExecutors 执行 Callable 时会返回一个 Future 对象。使用 Futu原创 2020-11-05 18:18:18 · 217 阅读 · 0 评论 -
在静态方法和非静态方法上加 Synchronized的区别
Synchronzied 修饰非静态方法==》对象锁Synchronzied 修饰静态方法==》其实是类锁,因为是静态方法,它把整个类锁起来了;情况1:同一个对象在两个线程中分别访问该对象的两个同步方法结果:会产生互斥。解释:因为锁针对的是对象,当对象调用一个synchronized方法时,其他同步方法需要等待其执行结束并释放锁后才能执行。情况2:不同对象在两个线程中调用同一个同步方法结果:不会产生互斥。解释:因为是两个对象,锁针对的是对象,并不是方法,所以可以并发执行,不会互斥。形象的来说就原创 2020-09-07 19:25:56 · 491 阅读 · 0 评论 -
线程的生命周期
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。新建:就是刚使用new方法,new出来的线程;就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调原创 2020-09-07 19:16:49 · 343 阅读 · 0 评论 -
乐观锁与悲观锁
悲观锁:每次访问数据线程都是处于阻塞的状态,这样提高安全性,像读锁,写锁都是用到了悲观锁,以及synchronize关键字(独占锁);缺点:可能会导致优先级高的线程等待优先级低的线程导致优先级倒序;加锁,放锁次数过多,引起性能问题乐观锁:每次访问数据线程都是运行状态,这样可以提高数据吞吐量。就假定不会发生并发冲突,最后通过比较数据来查看是否真的发生了冲突,并交由用户来决定。最典型的实现方式是CAS(compare and swap)像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生原创 2020-09-07 19:11:33 · 97 阅读 · 0 评论 -
阻塞队列
什么是阻塞队列?java.util.concurrentpublic interface BlockingQueue extends Queue阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。方法\处理方式原创 2020-08-31 20:44:03 · 109 阅读 · 0 评论 -
CountDownLatch
简单易懂的文章转载 2020-08-31 20:01:45 · 72 阅读 · 0 评论 -
JAVA线程池ExecutorService
线程池的优势降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。提供更强大的功能,延时定时线程池。线程池主要参数public ThreadPoolExecutor(int corePoolSi原创 2020-08-31 17:33:24 · 193 阅读 · 1 评论