![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java多线程
Ysdo
热爱记录和分享的打工人er
展开
-
JAVA线程池
原理:线程池本质就是一个集合(ArrayList,LinkedList<Thread>,HashSet,HashMap),当程序第一次启动时,启动多个线程保存到一个集合中,想要使用线程时从集合中取出来集合,所以一般使用LinkedList集合,当时用完一个线程时需归还到线程池,在JDK1.5之后,java内置了线程池,无需自己创建集合。合理使用户线程池的好处:1.降低资源损...原创 2019-07-07 17:13:08 · 120 阅读 · 0 评论 -
volatile关键字是如何保证程序的可见性
volatile被喻为轻量级的"synchronized",虽然一定程度上要比synchronized关键字效率要高,但它也有不足之处,就是不具有互斥性和原子性。volatile关键字的主要作用就是保证各线程之间的可见性,意思就是在多线程环境下,某个共享变量如果被其中一个线程给修改了,其他线程能够立即知道这个共享变量已经被修改了,当其他线程要读取这个变量的时候,最终会去内存中读取,而不是从自...原创 2019-09-08 16:41:46 · 1620 阅读 · 1 评论 -
CAS机制
悲观锁(Pessimistic Lock)顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。乐观锁(Optimistic Lock)...原创 2019-09-09 09:56:27 · 165 阅读 · 0 评论 -
ConcurrentHashMap
线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他...原创 2019-09-09 10:21:39 · 147 阅读 · 0 评论 -
java闭锁CountDownLatch
java.util.concurrent包下有个CountDownLatch类,文翻译为倒计时锁存器,是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:确保某个计算在其需要的所有资源都被初始化之后才继续执行; 确保某个服务在其依赖的所有其他服务都已经启...原创 2019-09-09 14:09:04 · 129 阅读 · 0 评论 -
多线程实现之 实现callable接口
Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子:package juc;import java.util.concurrent...原创 2019-09-09 17:03:14 · 699 阅读 · 0 评论 -
线程同步之 lock
Lock是一个接口,是通过代码来实现的,他的底层也是基于CAS原理,属于一种乐观锁,他与synchronized也有一定的区别:1.用法不一样。synchronized既可以加在方法上,也可以加载特定的代码块上,括号中表示需要锁的对象。而Lock需要显示地指定起始位置和终止位置。synchronzied是托管给jvm执行的,Lock锁定是通过代码实现的。2.在性能上来说,如果竞争资源不激烈,...原创 2019-09-09 21:46:36 · 205 阅读 · 0 评论 -
生产者与消费者synchronized +wait/notifAll 和Lock+await/singalAll分别实现
synchronized +wait/notifAll实现public class ProductAndConsumer { public static void main(String[] args) { Clerk clerk = new Clerk(); Product product = new Product(clerk); ...原创 2019-09-10 10:25:19 · 283 阅读 · 0 评论