实现多线程的编程语言有哪些?不支持多线程的编程语言有哪些?
Java是如何支持多线程的?
线程安全问题
最基本的多线程
多线程并发
线程池的概念
NIO的理解和概念
线程同步
线程间通信
线程死锁
线程控制:挂起、停止和恢复
多线程是什么?
JVM是如何实现多线程的?
多线程问题是需要从硬件到操作系统到jvm到用户程序整套体系全部支持,才能实现多线程的功能。
Cpu本身有超线程技术来实现单cpu两个运算通道。比如双核超线程cpu电脑对操作系统来说会识别为4个处理器。
在linux操作系统层面来说:实现线程的功能,有从基础到高级的4中模式:内核线程、轻量级线程、用户线程、混合线程(轻量级+用户)。
Jvm实现线程的方式:在windows,linux,Safari上面,是通过调用各个操作系统内核的线程实现的。比如linux,JVM线程跟内核轻量级进程有一一对应的关系,在linux下,只要一个Thread.run就会调用一个fork产生一个线程。
对于计算密集型任务:计算任务会占用大量cpu时间,所以如果线程数量过多,线程切换工作会消耗性能,所以计算密集型不适合线程数太多。
对于io密集型任务:io消耗的cpu资源较少。当一个任务执行IO操作的时候,线程将会被阻塞,处理器立刻会切换到另外一个合适的线程去执行。如果我们只拥有与内核数量一样多的线程,即使我们有任务要执行,他们也不能执行,因为处理器没有可以用来调度的线程。
如果线程有50%的时间被阻塞,线程的数量就应该是内核数量的2倍。于是我们可以得到下面的线程数量计算公式:
线程数量=内核数量 / (1 - 阻塞率)
我们可以通过相应的分析工具或者java的management包来得到阻塞率的数值
理解了这些,我们就可以这样认为:jvm线程与操作系统线程紧密结合,所以我们只要关注在jvm线程的实现,便可以实现良好的多线程编程。
二 Java实现多线程的几种方式
1 继承Thread,实现Runnable接口
2
三 多个线程之间的调度和转换
1 主线程等待多个子线程完成
CountDownLatch
2 线程的await和
四 线程之间有嵌套关系吗?Java中线程的树状结构,是否有子线程的子线程。
五 线程安全问题
java的volatile
Java里阻塞线程的三种实现方法
https://my.oschina.net/flashsword/blog/114527
http://www.cnblogs.com/zhuawang/p/3756151.html
http://blog.csdn.net/yellowatumn/article/details/49738551
http://lavasoft.blog.51cto.com/62575/27069/
http://blog.csdn.net/sadfishsc/article/details/10325879
http://www.importnew.com/12773.html
http://blog.csdn.net/ghsau/article/details/7451464
设计模式 |
多线程 |
sql优化技术 面试 |
mysql面试题 |
并发的面试题 |
elasticsearch |
图书在线阅读系统研究 |
java的nio |
Java的nio避免了java堆和native堆之间来回复制数据
注意jvm的“直接内存”
多线程、阻塞、非阻塞的概念:
多线程的一些模式:master/worker,fulture,生产者/消费者模式
ConcurrentMap:
CopyOnWriteArrayList
ReentrantLock
AtomicInteger