高并发(1)

157 阅读2分钟

线程相关

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使用方法
    1. 指定加锁的对象:给对象加锁,进入同步代码块要获得指定对象的锁
    2. 作用于实例方法:进入方法之前要获得方法的锁
    3. 作用于静态方法块:对症各类枷锁,要获得类的锁

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,可能会同时对一个位置进行写(覆盖掉另一