找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 187|回复: 0

线程的一些东西

[复制链接]

373

主题

55

回帖

1944

积分

管理员

积分
1944
发表于 2020-11-13 23:29:46 | 显示全部楼层 |阅读模式
Excutors 创建各种各样的线程池执行任务
线程池的构建主要依赖于ThreadPoolExcutor
主要的构建参数有
核心线程数
最大线程数
阻塞队列
空闲线程的最大存活时间
ThreadFactory 线程工厂
拒绝策略




volatile 是java 虚拟机轻量级同步机制
保证修饰变量的可见性以及禁止指令重排。

单例模式下需要使用volatile 去修饰实例变量,保证对象初始化完成后对其他线程可见。
CAS
全称是Compare And Swap, 比较和交换
有三个重要的关键值。
待修改变量
期望值
目标值

如果待修改的变量==期望值, 表示该变量没有被其他线程修改, 因此修改目标变量为目标值。


CAS 底层的原理是使用Java 的Unsafe 类, 保证多线程操作变量的原子性


CAS 的缺点, 如果线程之间竞争十分激烈,短时间内无法获取到锁完成操作,那么会导致cpu 空转浪费计算资源。
CAS 只能保证单个变量的原子性。
而且会有ABA 问题。但是解决ABA 问题的一种解决方案是使用版本号


AtomicReference


ArrayList 是线程不安全的


ContainerUnSafeDemo



对CopyOnWriter的容器可以进行并发读不需要加锁。
实现读写分离。


CopyOnWriteArrayList
CopyOnWriteHashSet
ConcurrentHashMap


公平锁, 多个线程按照申请锁的顺序去获取锁
非公平锁,多线程竞争锁可能不会按照线程先后申请顺序


ReentrantLock
Synchronized 可重入锁。

目的: 避免死锁。


Semaphore 主要的两个方法:
acquire
release



BlockingQueue
        ArrayBlockingQueue
        LikedBlockingQueue
        PriorityBlockingQUeue
        DelayQueue
        SynchronousQueue



BlockingQueue
        生产者消费者模型
        线程池
        消息中间件。




线程池:
主要是控制线程的数量

提交任务后创建新的线程执行任务, 如果没有空余线程则进入阻塞队列
当出现空余线程后再从阻塞队列中获取任务执行


可以实现线程复用。
控制线程最大的并发数量
方便管理线程

线程池可以统一销毁线程
线程复用不用频繁的创建销毁线程,提高线程的执行效率
控制线程并发数量防止线程数量过大影响系统性能。


好处:


可以通过Excutors 创建各种各样的线程

Executors.newFixedThreadPool();
new CachedThreadPool();
SingleThreadPool()



线程池的拒绝策略有几种
1. 默认时直接拒绝
2. 由主线程去执行任务
3. 直接丢弃
4. 丢弃队列中排队最久的任务



wait 方法调用后会释放掉当前线程持有的锁并且处于waiting状态等待唤醒

当线程被唤醒后将会重新进入到同步队列竞争锁,抢到锁之后才有机会执行wait之后的代码。


yield 以及Thread.sleep 对线程的锁没有影响,

调用notify 方法后会将处于等待队列中的线程移动到同步队列中

当同步代码执行完毕后会自动唤醒同步队列中的线程。






HashMap 以及HashTable 的区别

众所周知, HashMap 是线程不安全的, HashTable 所有方法上添加了Synchronized 同步修饰符,因此保证了多线程访问的安全性,

由于线程安全实现通过锁机制保证,因此会性能上于HashMap 略差。
HashMap 允许key为null,但是HashTable 不允许。

HashTable key 或者value 为空的时候都会产生NPE异常NullPointerExcpetion


HashMap 默认初始化数组大小为16, 扩容时扩大到原来的2倍。


多线程最佳实践
1、 创建的线程设置具有意义的名字,方便后期的测试、调试、排查问题
2、 缩小同步代码块的范围
3、 多用同步类少用wait、notify
4、 多用并发集合少用同步集合
5、 尽量的无锁化编程


保证多线程并发条件
CountDownLatch

保证多线程以一定的并发数执行
CyclicBarrier


保证多线程最大的并发数量
Semaphtore



Reachable

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, 2024-9-20 09:38 , Processed in 0.027885 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表