线程相关
1. 线程概念
2. 线程的状态
-
new
新建一个线程 Thread thread = new Thread()//或者是Runnable -
runnable
线程可以运行了,但是线程要等待cpu调度,拥有时间片才能真正初于运行状态 thread.start() //会新建一个线程 thread.run() // 并没有新建一个线程,只是一个方法调用,只是会在当前线程穿行执行run的代码 -
waiting
-
timed waiting
和waiting一样,可能会被wait(),只有等待notify/notifyAll()来唤起线程 -
blocked
进入synchronized方法块,等待获得锁的状态就是blocked -
terminated
线程结束 thread.stop()//会直接结束线程,释放现成的锁,可能会导致数据不一致的问题(如果stop的时候线程正在写入对象,但是stop会立即销毁线程,释放锁,对象写入没有完全完成,下一个读取对象的线程就会读取到不对的数据) 可以使用标计量的方法来决定线程是否结束(true/false)
3. 线程安全 (synchronized关键字)
- 线程安全,在一个线程写的时候,另一个线程不仅不能写,而且也不能读取(读到的可能是过期数据)
- synchronized使用方法
- 指定加锁的对象:给对象加锁,进入同步代码块要获得指定对象的锁
- 作用于实例方法:进入方法之前要获得方法的锁
- 作用于静态方法块:对症各类枷锁,要获得类的锁
4. 并发下的arraylist(线程不安全的arraylist会出现的问题)
eg:多个线程(2)同时向arraylist中添加元素(10000个),可能有三种情况
(1)arraylist的确有20000个元素
(2)报错,arraylist在扩容的过程中,内部一致性被破坏,没有锁,会报越界的错误
(3)没有错误提示,但size的值不是20000,可能会同时对一个位置进行写(覆盖掉另一个的值)
5. 并发下的诡异的hashmap
eg:多个线程(2)同时向hashmap中添加元素(10000个),可能有三种情况
(1)arraylist的确有20000个元素
(2)程序永远无法正常结束:链表成环(jdk1.7,jdk1.8没有这个问题)
(3)没有错误提示,但size的值不是20000,可能会同时对一个位置进行写(覆盖掉另一