高并发记忆

Posted mxz1994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发记忆相关的知识,希望对你有一定的参考价值。

T1 重入锁 加锁后调用的方法加通向的锁, 锁计数+2
加锁方法碰到异常后会释放锁,其他线程会访问到错误的同步代码块数据 进行事务回滚

MyContainer4 互相叫醒 wait 释放锁 叫醒的时候要把锁在还给它
5、CyclicBarrier和CountDownLatch(await countDown)的区别

两个看上去有点像的类,都在java.util.concurrent下,都可以用来表示代码运行到某个点上,二者的区别在于:

(1)CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行

(2)CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务

(3)CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了


synchronized和ReentrantLock的区别

synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

(1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁
Lock lock = new ReentrantLock(); lock.lock();lock.unlock() 手动加锁手动释放, 遇到异常也不释放,所以写在finally
可以尝试lock locked = lock.trylock(5, TimeUnit.Seconeds) 在指定时间内获得锁,获得不到就往下执行
或者主动让别人把锁释放(lock.lockInterruptibly 加锁 对外面的interrupt打断作出响应)
ReentrantLock( new ReentrantLock(true);公平锁 但是效率低谁等时间长谁用 而不是抢占式)
wait 往往和while使用
lock.newCondition() 可以指定叫醒哪个 await signalAll

(2)ReentrantLock可以获取各种锁的信息

(3)ReentrantLock可以灵活地实现多路通知

另外,二者的锁机制其实也是不一样的。ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word,这点我不能确定。

ThreadLocak 空间换时间每个线程都保留不同的值在map里 synchronized 时间换空间
hibernate的session就是存在threadlock

Collections.synchronizedXXX(加锁集合)
vector 同步容器有锁

HashTable 整个对象 全加锁 hashMap没锁 ConcurrentHashMap 分块加锁(多块加锁)
ConcurrentSkipList 排序高并发
CopyOnwriteArrayList 写的时候加锁复制,不影响读

ConcurrentLinkedQueue poll 取出删掉 pick 只取出 双端队列 ConcurrentLinkedDeque
BlockingQueue -LinkedBlockingQueue 无界(put 如果满了就等待 take‘空了就等待 自动实现生产者消费者额)
-ArrayBlockingQueue 有界() offer(不报 也可以按时间段阻塞 offer(e, time, 单位)) 和 add(加满报异常) put阻塞等待
-DelayQueue 每个元素再记录可被取出的时间 时间最长的先拿 执行定时任务
SynchronousQueue 容量为0(不能add 只能put阻塞等待消费者消费 特殊的transfer 不能放在容器中)
LinkedTransferQueue transfer 消费者先启动,生产者生产的就不往队列里丢了,直接给消费者
如果先生产,就会阻塞


Executor
ExecutorService submit(Cakllable)
Callable 有返回值的线程
Executors 工厂类
newFixedThreadPool(5) 创建有5个线程池,然后6个任务只有五个调用,多的一个会放到BlockingQueue队列中
维护了两个队列(完成和未完成)
shutdown (关闭但是会等执行完) isTetminated (还有任务在执行吗)
FuterTask(Callable)
submit(FuterTask) get 阻塞获取

newCachedThreadPool() 创建可伸缩线程池, (alvietime)60s后空闲线程会销毁
newSingleThreadExecotor
newScheduleThreadPool() scheduleAtFixedRate(runable,0,500,单位)
newWorkStealingPool() 任务窃取 ,主动找任务 并且是daemo守护线程(后台线程)(原理Forkjoin)

ForkJoinPool 将任务分而治之
创建子任务(继承ForkJoinTask子类 例如:继承RecursiveAction(没返回值) RecursiveAction(有返回值 return subtask.join())) fork()
execute(ForkJoinTask)
仍然是后台线程 System.inread()

Collection parallelStream 接口里定义default 方法 多线程















































以上是关于高并发记忆的主要内容,如果未能解决你的问题,请参考以下文章

java高并发?

java高并发,如何解决,啥方式解决,高并发

高并发内存池

高并发内存池

高并发内存池

java 怎样处理高并发