Java多线程基础总结

Posted wxw16

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程基础总结相关的知识,希望对你有一定的参考价值。

一、线程和进程关系

二、创建方式
1.继承Thread类,重写run方法
2.实现Runable接口,重写run方法
3.使用匿名内部类

三、API接口
start()
currentThread() 获取当前线程对象
getID() 获取当前线程ID Thread-编号 该编号从0开始
getName() 获取当前线程名称
sleep() 休眠线程
stop() 停止线程

四、实例化线程
Thread() 分配一个新的 Thread 对象
Thread(String name) 分配一个新的 Thread对象,具有指定的 name正如其名
Thread(Runable r) 分配一个新的 Thread对象
Thread(Runable r, String name) 分配一个新的 Thread对象

五、守护进程
用户线程,不会随主线程停止而停止
守护线程,随主线程停止也停止,setDaemon(true),设置守护线程
gc线程属于守护线程

六、多线程运行状态

新建状态 Thread thread = new Thread()
就绪状态,等待CPU调度 thread.start()
运行状态 thread.run()
阻塞状态 thread.sleep()
死亡状态 thread.stop()

七、join()方法
join()的作用是让其他的线程变为等待,直到当前线程执行完毕。

八、线程安全问题
多个线程同时共享,同一个全局变量或静态变量,做写操作,可能会发生数据冲突问题。

九、线程安全解决办法
synchronized或使用lock锁

1. 同步代码块,可以是任意对象
synchronized(同一个数据){
可能会发生线程冲突问题
}
2. 同步函数,使用this锁。
3. 静态同步函数,使用字节码文件锁。

九、死锁问题
嵌套同步,导致锁无法释放

十、多线程三大特性
原子性、可见性、有序性。

十一、Java内存模型(JMM)
线程之间的共享变量存储在主内存,每个线程都有一个私有的内地内存,本地内存中存储了该线程以读/写共享变量的副本。本地内存只是一个概念,涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编辑器优化。

十二、Volatile
Volatile关键字解决了线程之间的可见性问题。Volatile强制线程每次读取值都从主内存“取值”。

十三、AtomicInteger原子类
可以通过线程安全的方式操作加减。

十四、volatile与synchronized区别
仅靠volatile不能保证线程的安全性。(原子性)
①volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法
②volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。
synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。
线程安全性
线程安全性包括两个方面,①可见性。②原子性。
仅仅使用volatile并不能保证线程安全性。而synchronized则可实现线程的安全性。

十五、线程间通讯,wait()和notify(),notifyAll()
属于Object方法
wait()可以让当前类锁住的线程从运行状态变为休眠状态,释放锁的资源。
notify()可以让当前类锁住的线程从休眠状态变为运行状态。

一般在线程同步中,同一个锁资源使用。

十六、Lock锁(jdk1.5并发包)
Lock lock = new ReentrantLock();
try{
lock.lock();
lock.unlock();
}catch(){
}

十七、Condition实现和wait()、notify()一样的功能
await();同wait()
signal();同notify()

十八、怎么停止线程
不建议使用stop(),
1、设计while,变量判断退出循环。
2、interrupt()让线程抛出异常。

十九、ThreadLock
为每一个线程提供一个局部变量。
底层实现
Map.put(Thread.currentThread(), Object);

二十、Java并发包
原子类、Lock、并发类

二十一、Vector和ArrayList
实现原理都是通过数组实现,查询速度快,增加、修改、删除速度慢。区别
Vector是线程安全的,ArrayList是线程不安全的。

二十二、HasTable和HasMap
实现原理都是通过链表+数组
HasTable是线程安全的,HasMap是线程不安全的。

二十三、Collection.synchroniedMap()
把非安全的Map集合转为安全的Map。(代理模式)

二十四、ConcurrenHasMap
分段锁,将一个整体拆分成多个小的HasTable,默认分16段。

二十五、CountDownLatch
计数器,可以限制执行顺序。
CountDownLatch countDownLatch = new CountDownLatch(2);
countDownLatch.countDown();每次减1
countDownLatch.countDown();
countDownLatch.await(); 不为0时一直等待

二十六、CyclicBarrier
计数器,当线程数达到一定的数量,并发执行。
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
cyclicBarrier.await; 等待线程达到5个,一起并发执行

二十七、Semaphore
计数器
Semaphore semaphore = new Semaphore(5); 最大资源数
semaphore.availablePermits(); 判断资源
semaphore.acquire(); 获取资源
semaphore.release(); 释放资源

二十八、并发队列
有界和无界
阻塞队列和非阻塞队列
ConcurrentLinkedDeque,无界非阻塞队列
BlockingQueue,有界阻塞队列

转载请注明出处。
作者:wuxiwei
出处:http://www.cnblogs.com/wxw16/p/8915834.html 






















































































以上是关于Java多线程基础总结的主要内容,如果未能解决你的问题,请参考以下文章

Java基础总结--多线程总结2

java 面试基础总结---多线程

Java多线程基础总结

[Java] 多线程基础详细总结,附加详细实例

Java基础总结多线程

Java基础总结--多线程总结1