一、并发编程里面解决生产消费者模型你知道哪几种方式?
二、你知道阻塞队列BlockingQueue吗?介绍下常见的阻塞队列?
三、你知道非阻塞队列ConcurrentLinkedQueue吗,它怎么实现线程安全的??
四、???说说你认为的并发编程最佳实践?
一、并发编程里面解决生产消费者模型你知道哪几种方式?
核心:要保证生产者不会在缓冲区满时放入数据,消费者也不会在缓冲区空时消耗数据 常用的同步方法是采用信号或加锁机制 1、wait() / notify()方法 ? ?? 2、await() / signal()方法 ? ? 用ReentrantLock和Condition实现等待/通知模型 ? 3、Semaphore信号量 ? 4、BlockingQueue阻塞队列 ? ? ArrayBlockingQueue ? ? LinkedBlockingQueue ? ? ? ? put方法用来向队尾存入元素,如果队列满,则阻塞 ? ? ?take方法用来从队首取元素,如果队列为空,则阻塞?
以上4个都是基于单个应用的,分布式场景中无法使用。
二、你知道阻塞队列BlockingQueue吗?介绍下常见的阻塞队列?
BlockingQueue: j.u.c包下的提供了线程安全的队列访问的接口,并发包下很多高级同步类的实现都是基于阻塞队列实现的 ? 1、当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满 2、从阻塞队列读数据时,如果队列为空,线程将会阻塞等待直到队列里面是非空的时候
常见的阻塞队列 ? ? ArrayBlockingQueue: ? ? ? ? 基于数组实现的一个阻塞队列,需要指定容量大小,FIFO先进先出顺序 ? ?? ? ? LinkedBlockingQueue: ? ? ? ? 基于链表实现的一个阻塞队列,如果不指定容量大小,默认 Integer.MAX_VALUE, FIFO先进先出顺序 ? ?? ? ? PriorityBlockingQueue: ? ? ? ? 一个支持优先级的无界阻塞队列,默认情况下元素采用自然顺序升序排序,也可以自定义排序实现 java.lang.Comparable接口 ? ?? ? ? DelayQueue: ? ? ? ? 延迟队列,在指定时间才能获取队列元素的功能,队列头元素是最接近过期的元素,里面的对象必须实现 java.util.concurrent.Delayed 接口并实现CompareTo和getDelay方法?
三、你知道非阻塞队列ConcurrentLinkedQueue吗,它怎么实现线程安全的??
线程安全原因: ConcurrentLinkedQueue是基于链表实现的无界线程安全队列,采用FIFO进行排序 保证线程安全的三要素:原子、有序、可见性 ? 1、底层结构是Node,链表头部和尾部节点是head和tail,使用节点变量和内部类属性使用volatile声明保证了有序和可见性 ? 2、插入、移除、更新操作使用CAS无锁操作,保证了原子性 ? 3、假如多线程并发修改导致 CAS 更新失败,采用for循环插入保证更新操作成功
四、???说说你认为的并发编程最佳实践?
平时多线程用的挺多的,写出3条你遵循的多线程最佳实践?
?给不同模块的线程起名称,方便后续排查问题 ? 使用同步代码块或者同步的方法的时候,尽量减小同步范围 ? 多用并发集合少用同步集合 ? ? 支持线程安全 ? ? ? ? 同步集合:Hashtable/Vector/同步工具类包装Collections.synXXX ? ? ? ? 并发集合:ConcurrentHashMap、CopyOnWriteArrayList ? 线上业务需要使用多线程,优先考虑线程池是否更加合适,然后判断哪种线程池比较好,最后才是自己创建单一线程
用过线程池不? 有什么好处, java里有哪些是常用的线程池?
好处:重用存在的线程,减少对象创建销毁的开销,有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞,且可以定时定期执行、单线程、并发数控制,配置任务过多任务后的拒绝策略等功能 ? 类别 newFixedThreadPool? ? ? 一个定长线程池,可控制线程最大并发数 ? newCachedThreadPool ? ? 一个可缓存线程池 ? newSingleThreadExecutor ? ? 一个单线程化的线程池,用唯一的工作线程来执行任务 ? newScheduledThreadPool ? ? 一个定长线程池,支持定时/周期性任务执行
做Java开发这些年,线程池的使用细节和坑你真的了解吗?仔细看看吧~_这是王姑娘的微博的博客-CSDN博客一、【阿里巴巴编码规范】 线程池不允许使用 Executors 去创建,要通过 ThreadPoolExecutor的方式原因Executors创建的线程池底层也是调用 ThreadPoolExecutor,只不过使用不同的参数、队列、拒绝策略等,如果使用不当,会造成资源耗尽问题;直接使用ThreadPoolExecutor让使用者更加清楚线程池允许规则,常见参数的使用,避免风险?常见的线程池问题:newFixedThreadPool和newSingleThreadExecutor: ...https://blog.csdn.net/wnn654321/article/details/122442249
|