java 多线程

  • BIO
    传统的阻塞I/O和线程池模型
  • NIO
    NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,
    已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。

  • concurrent
    1)位置:rt.jar java.util.concurrent
    2)atomic
    通过将变量设置为volatile,提供可见性和有序性保证.
    通过Unsafe来操作数据,并进行原子化的比较和交互操作(unsafe.compareAndSwapInt/compareAndSwapLong/compareAndSwapObject).
    3)BlockingQueue
    使用ReentrantLock来进行锁操作.
    notFull在队列已经满且有新的对象插入的时候,将线程锁住;在有对象取出来的时候,开放一个线程的存入操作.
    notEmpty在队列已经空且需要取数据的时候,将线程锁住.
    3)线程操作关键字
    volatile lock synchronize sleep wait notify notifyAll join ReentrantLock

java多线程方面的知识主要是要解决主线程和子线程数据内容不一致,操作顺序不一致的问题.

java在JDK1.5引入了concurrent包,帮助大家解决多线程的问题.
其中比较有代表性的有Atomic类和BlockingQueue
1)Atomic源码
①通过volatile来解决数据一致性和可见性问题.

通过乐观锁来更新数据.
通过内置的unsafe执行compareAndSwap的CPU指令操作,是原子性操作
能解决多线程数字累加问题.
2)ArrayBlockingQueue源码
BlockingQueue是一个可供多线程操作的定长队列.ArrayBlockingQueue 是他的一种FIFO实现.
take 操作,会首先获取ReentrantLock 然后判断队列里是否有数据.如果没有数据执行condition的await操作.
使用ReentrantLock来管理多线程取数存数的逻辑

file:///D:/download/Java%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%BC%96%E7%A8%8B%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF.pdf

ConcurrentHashMap

HashTable

解决ArrayList并发
一:使用synchronized关键字,这个大家应该都很熟悉了,不解释了;

二:使用Collections.synchronizedList();使用方法如下:

    假如你创建的代码如下:List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();  List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());

//synchronizedMap
Map<String, String> synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());

线程安全 vector
StringBuffer是线程安全,而StringBuilder是线程不安全的。