Java多线程与并发
1.创建线程的三种方法
1.3.使用callable和future 可以有返回值和抛异常。使用线程池启动
2.Synchronized的线程同步机制,Synchronized是独占锁
解决问题:多个线程同时操作一个数据时所产生的数据不安全问题,以下为Synchronized的三种使用方法
2.1 通过synchronized修饰方法
2.1.2在方法命名前加上synchronized关键字,即可。
2.1.1synchronized都是有个默认锁对象的,被synchronized修饰的方法的锁对象为 this
2.2 同步代码块
获取锁才可以执行,多个块共用一把锁时,只有一个获得锁的线程才可以访问。锁对象为自己定义的lock
2.3 Synchronized的静态方法
synchronized静态方法中的锁对象为 该类的字节码对象 ClassName.class
3.线程是五中状态
4.死锁,多线程对公共资源使用时出现冲突
5.线程安全
6.jdk并发包,juc
6.1线程池优点
6.2 线程池类型
6.2.1 CachedThreadPool 可缓存线程池:数量可无限大,有空闲可直接用,没有空闲线 程就创建
6.2.1 FixedThreadPool 定长线程池。默认使用先进先出fifo原则
6.2.1 SingleThreadExecutor 单线程线程池
6.2.1 ScheduledThreaPool 调度线程池 通过schedule方法来使用,延迟时间后启动;通 过schedule方法来scheduleAtFixedRate周期执行。(项目中一般使用quartz 成熟的调度框架)
6.3 CountDownLatch倒计时锁
6.4 信号量SemaPhore
Semaphore semaphore = new Semaphore(5);
6.5 循环屏障CyclicBarrier
6.5.1 CyclicBarrier的使用场景,多线程必须同时开始的场景
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
6.6 重入锁
推荐使用synchronized较为简单,synchronized是可重入锁
6.7 Condition线程等待与唤醒
使用示例:配个重入锁使用,c1.wait暂停,c1.signal唤醒
6.8 callable 和 Future
6.9 juc同步容器
6.9.1 juc提供保证线程安全并提升效率的并发容器,直接替换使用
6.9.2hashTable 和ConcurrentHashMap 区别:
hashTable 直接加synchronized锁, ConcurrentHashMap 是采用“分段锁”,把整体切分成多段,每段加锁,不同的线程操作不同段块
6.10 Atomic为线程安全设计的包,乐观锁
6.10.1 原子性:一个操作或多个操作要么全都执行且过程不被打断,要么全不执行
6.10.2 cas 乐观锁,只适合一些小粒度型数值来使用,比如计数器