盲猜工作主力语言为java,因此renew一下基础知识
JAVA泛型
(1)泛型类和接口
1 | public class Stack<E>{ |
(2)泛型方法
1 | public class Main{ |
(3)受限类型
1 | public class Main{ |
(4)通配泛型
1 | ?可代表全部 ? extends E 代表E或者E的子类型 ?super E代表E或者E的父类型 |
(5)泛型的一些限制
1 | 1. 不能使用 new E() 不能使用泛型类型参数创建实例 |
JAVA多线程
(1)通过实现Runnable接口定义一个任务类
1 | class Task implements Runnable{ |
(2)通过定义Thread的子类,并实现其run方法来定义线程
1 | public class WelcomeApp { |
(3)synchronized 关键字
1 | public class SafeCircularSeqGenerator implements CircularSeqGenerator { |
(4)volatile 关键字
1 | volatile long value; |
(5)显示锁
1 | private final Lock lock = new Lock(); |
(6)tryLock方法
1 | Lock lock = ...; |
(7)isLocked() 和 getQueueLength()
1 | isLocked() 用于检测相应锁是否被某个线程持有 |
(8)内部锁和显示锁的选用
1 | 默认使用内部锁,当需要使用显示锁的特性时再使用 |
(9)读写锁
1 | public class ReadWriteLockUsage{ |
(10)写锁降级为读锁
1 | public class ReadWriteLockUsage{ |
(11)读锁升级为写锁
1 | ReentrantReadWriteLock 不支持锁的升级,读线程如果要转而申请写锁,必须先释放读锁然后才能申请写锁 |
(12)java单例模式
单例(singleton)模式时GOF(Gang of Four)设计模式较容易理解的,运用也较广泛的模式,单例模式所要实现的目标效果非常简单:保持一个类有且仅有一个实例
单线程版单例模式
1 | public class SingleThreadedSingleton{ |
但是这样的单线程单例模式在多线程时会出现问题,线程A在执行到操作①时都判定该实例未被创建,但可能此时线程B刚好对其赋值,可线程A仍会进入到if语句中,也就是会继续创建一个实例
通过简单内部锁实现的单例模式
1 | public class SimpleMultithreadedSingleton{ |
这种利用Synchronized关键字进行简单的加锁,尽管是线程安全的,但是也意味着每次getInstance()都需要申请锁,于是为了避免锁的开销,有人就想出了先检查instacne是否为null的方法
基于双重检查锁定的错误单例模式实现
1 | public class IncorrectDCLSingleton{ |
基于双重检查锁定的正确单例模式实现
1 | public class DCLSingleton{ |
基于静态内部类的单例模式实现
1 | public class StaticHolderSingleton{ |
基于枚举类型的单例模式实现
1 | public class EnumBasedSingletonExample{ |
(13)线程设置数的原则
设 Nc表示一个系统的处理器数目,具体的线程数可以根据以下规则:
●对于CPU密集型线程,因为占用CPU资源,因此可以考虑设置为 Nc 个线程数,考虑到有时候会因为一些中断被切出,因此将数量设置为Nc+1
●对于I/O密集型线程,考虑到I/O操作可能导致上下文切换,可以设置为 2Nc个线程数
商用软件往往规定CPU使用率要低于一个阈值,一般为75%,可以用 Nt = Nc Uc *(1+WT/ST)
Nt为线程数的合理大小 Uc为使用率阈值 WT为程序等待IO的时间 ST时程序占用CPU的时长
线程间协作
(1)等待与通知
● Object.wait()实例
1 | //调用wait方法前获得相应对象的内部锁 |
● Object.wait()注意点
1 | 等待线程对保护条件的判断,Object.wait()调用总是放在相应对象所引导的临界区的循环语句中 |
● Object.notify()实例
1 | synchronized(someObject){ |
● Object.notify()注意点
1 | Object.notify()方法调用总是放在相应对象内部锁引导的临界区之中 |
1 | // 单例模式 和 wait/notify 的混合 |