codecamp

concurrent

笔者能力有限,总结有误的地方,请读者协作更正。需要了解更多,请阅读相关书籍。

1.谈一谈Concurrent并发工具包 ? Concurrent并发工具包是java1.5之后出现的,里面提供了很多和并发相关的工具,用于简化多线程开发。

2.什么是BlockingQueue? 线程阻塞式队列,用于一个线程产生产生对象,另一个线程消费对象这种使用场景。 可以用来实现 生产者-消费者机制; BlockingQueue有两个实现类: |- ArrayBlockingQueue
实现里BlockingQuery接口,是一个有界的阻塞队列,其内部实现是将对象放到一个数组里。 |- LinkedBlockingQueue
实现里BlockingQuery接口,底层是链表,可以设置容量大小。

3.谈一谈ConcurrentMap? 是一个线程安全的Map, 有一个实现类ConcurrentHashMap; HashMap - 线程不安全 效率高 HashTable - 线程安全 效率低 已经过时 不推荐使用 ConcurrentHashMap - 线程安全 效率比较高

ConcurrentHashMap效率: 锁不是加载整个Map上,而是加在正在操作的桶上的,从而在桶的级别实现了并发 提高效率 引入和读写锁,在并发读的过程中 可以并发 提升效率

4.什么是ExecutorService -- ThreadPool ? 执行器服务、线程池 线程池,用来共享线程,线程在需要的时候创建,用完后不销毁,而是存入线程池,则后续再需要使用线程时,可以直接从池中获取线程来使用,从而减少线程的开关次数,提升程序的性能。 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) corePoolSize 核心池大小 maximumPoolSize 最大池大小 keepAliveTime 空闲的多余线程保持时间 unit 时间单位 workQueue 阻塞式队列 handler 拒绝服务助手

(2)通过工具类获取常用的线程池实现
Executors newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。 newFixedThreadPool(int nThreads) 创建一个可重用固定线程数的线程池 newSingleThreadExecutor() 创建一个单一线程的线程池

2.执行任务 execute(Runnable) Future submit(Runnable) //可以通过Future的get()方法来观察任务是否执行结束 Future submit(Callable) //可以用来观察任务是否执行结束 并且可以从线程内部带回返回值 invokeAny() invokeAll()

    
3.关闭线程池
    shutdown()
        ExecutorService 并不会立即关闭,但它将不再接受新的任务,而且一旦所有线程都完成了当前任务的时候,ExecutorService 将会关闭
    shutdownNow()
        这样会立即尝试停止所有执行中的任务, 并忽略掉那些已提交但尚未开始处理的任务。 无法担保执行任务的正确执行。可能它们被停止了,也可能已经执行结束。

5.什么是Lock锁? 线程同步的机制 可以实现类似synchronized代码块的效果 但是比synchronized代码更灵活 更简单,两个实现类:

  • ReentrantLock
    • ReadWriteLock

6.什么是栅栏? 赛马,人到齐了一起跑

7.什么是闭锁? 来一个,条件满足,放行

IO和NIO
RPC和序列化
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

第2章 数据库

SQL

第4章 hadoop

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }