我正在参加「掘金·启航计划」
为什么用多线程
1. 通过并行计算提高程序性能
2. 等待网络、io响应导致的耗时问题
1. 实现线程:
继承thread 实现runnable 实现callable、future
2. 线程状态:初始、就绪、运行、终止
1. new 没有调用start方法
2. runnable 运行状态
3. blocked 阻塞【 等待阻塞 wait 、 同步阻塞synchronized 、 其他阻塞sleep/join】
4. waiting 等待
5. timed_waiting 时间等待
6. terminated 终止
3. interrupt 和 interrupted
1. interrupt优雅终止线程;
2. Thread.interrupted 对设置中断标识的线程进行复位
3. this.interrupted() 测试当前线程是否已经中断;this.isInterrupted() 测试线程是否中断
4. 线程的安全性问题
1. 可见性、原则性、有序性
5. synchronized关键字
1. 实现同步,底层原理 有个monitor(monitorenter和monitorexit)用来控制程序是否阻塞;
2. 支持重入锁,可以再继承关系中支持重入锁;
3. synchronized 方法是当前对象锁 【如果是加载静态static方法上是class锁】
4. synchronized代码块是某一个对象的锁
6. isAlive
判断当前线程是否处于活动状态 也就是已经启动且尚未终止
8. yield
放弃当前的cpu资源,让给其他任务执行,但是时间不确定
9,setPriority()
使用setPriority()方法设置线程的优先级,线程的优先级具有继承性
10. setDaemon()
使用setDaemon()设置是否守护线程 true为守护线程 默认false用户线程
11. sleep 和 wait
自动唤醒 不会释放锁 wait 自动释放锁 等待notify 唤醒 wait(long) 是再等待一段时间之后 自动唤醒
12. join
是所属线程执行 当前线程阻塞 在内部使用 wait()方法进行等待 synchronized 是使用 对象监视器 原理进行同步
13. ThreadLocal
线程自己的共享变量(重写 initialValue方法 设置默认值) public static 所有线程共享
14. 线程通信
1. 字节流通信 PipedInputStream 和 PipedOutputStream
2. 字符流同喜 PepedWriter 和 PipedReader
15. volitle 关键字
1. 变量的可见性,不能保证原子性 storeLoad 内存屏障
16.ReentrantLock
reentrantLock:公平锁和非公平锁(默认) isFair()
lock.lock();// 获取锁
for (int i = 0; i < 5; i++) {
System.out.println("theadName=" + Thread.currentThread().getName() + ("" + (i + 1)));
}
lock.unlock();//释放锁
1.使用notify()/notifyAll() 通知的线程是由jvm随机选择的。但是使用reentrantlock 结合condition 类是可以实现“选择性通知”
2.condition 使用await 等待,signal()/signalAll()唤醒
3.int getHoldCount 查询当前线程用了几次lock
4.int getQueueLength 返回正等待获取锁定的线程的估计数
5.int getWaitQueueLength 返回等待与此锁定相关的给定条件condition的线程估计数
6.boolean hasQueuedThread(Thread thread)查询指定线程是否正在等待获取此锁定
7.Boolean hasQueuedThreads()查询是都有线程正在等待获取此锁定
8.Boolean hasWaiters(Condition condition)查询是否有线程正在等待与此锁定有关的condition条件
9.boolean isHeldByCunrrentThread()查询当前线程是否保持此锁定
10.Boolean isLocked()查询此锁定是都有任意线程保持
11.lock.lockInterruptibly()锁定 如果被中断会报异常
12.boolean tryLock(),在调用时锁定未被另一个线程保持的情况下,获取该锁定。
13.Boolean tryLock(Long timeout,TimeUnit unit)如果锁定在给定的时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁定
14.线程在condition.await()是被interrupt会报异常,用awaitUninterruptibly不会报异常
17.ReentrantReadWriteLock
1. 可以加快运行效率
2. 分为两个锁:lock.readlock.lock读操作的锁(共享锁),写操作的锁(排它锁)。
3. 读锁之间不互斥,读写互斥,写锁与写锁互斥
18.单例实现(多线程情况下)
1. synchronize关键字+DCL双检查机制
2. 静态内置类
3. 序列化和反序列化的时候
private Object readResolve() throws ObjectStreamException {
// instead of the object we're on,
// return the class variable INSTANCE
return INSTANCE;
}
4. 使用static代码块
5. 使用enum枚举类型
19.AQS
1. FIFO队列 实现同步 CAS + volatile