知识点的文字梳理请参考这篇文章:java多线程核心技术梳理
下面对该模块的几个包作说明:
该部分是一些简单的基础知识的展示
- printMain.java:打印当前线程名称
- Run.java:非线程安全的数据共享
- Run2_StartVsRun.java:
run()
和start()
的区别 - Run3_getName.java:
this.getName()!=Thread.currentThread().getName()
,这是两个概念 - Run4_isAlive01.java:
isAlive()
- Run5_isAlive02.java:
isAlive()
- Run6_StartVsRun02.java:
run()
同步执行,start()
异步执行 - Run7_interrupt01.java:停止线程
- Run8_interrupted01.java:判断线程是否停止状态,测试当前线程是否已经中断
- Run9_interrupted02.java:线程的中断状态由
interrupted()
清除 - Run10_isInterrupted.java:
isInterrupted()
,不清除状态标记 - Run11_sleepAndinterrupt01.java:睡眠中停止,先进入的
sleep()
,再interrupt()
- Run12_sleepAndinterrupt02.java:先
interrupt()
,再进入sleep()
,直接进异常 - Run13_suspendAndresume01.java:暂停线程,
suspend()
与resume()
- Run14_suspendAndresume02.java:
suspend()
与resume()
的缺点:独占 - Run15_suspendAndresume03.java:
suspend()
独占锁问题,println()
- Run16_yield.java:测试
yield()
- Run17_priority01.java:线程优先级的继承性
- Run18_priority02.java:优先级具有规则性
- example1
- Run1_local.java:方法内局部变量则不存在“非线程安全”问题
- example2
- Run2_private01.java:实例变量非线程安全
- Run2_twoObject.java:多个对象多个锁
- example3
- Run3_synchronized01.java:
synchronized
方法与锁对象
- Run3_synchronized01.java:
- example4
- Run4_synchronized01.java:两个线程访问同一个对象的不同方法,线程 B 可异步调用非
synchronized
类型方法
- Run4_synchronized01.java:两个线程访问同一个对象的不同方法,线程 B 可异步调用非
- example5
- Run5_lockRein.java:
synchronized
锁重入,支持继承
- Run5_lockRein.java:
- example6
- Run6_exception.java:出现异常,锁自动释放
- example7
- Run7_synNotExtends.java:同步不具继承性
- example8
- Run8_synchronized01.java:
synchronized
方法的弊端 - Run8_synchronized02.java:同步代码块解决同步方法的弊端
- Run8_synchronized01.java:
- example9
- Run9_synchronized01.java:当多个线程同时执行
synchronized(x){}
同步代码块时呈现效果 - Run9_synchronized01_twoObjects.java:不同的“对象监视器”
- Run9_synchronized02.java:当其他线程执行 x 对象中
synchronized
同步方法时呈同步效果 - Run9_synchronized03.java:当其他线程执行 x 对象里面的
synchronized(this)
代码块时,也呈现同步效果
- Run9_synchronized01.java:当多个线程同时执行
- example10
- Run10_synBlockMoreObjectOneLock.java:验证同步
synchronized(class)
代码块的作用 - Run10_synMoreObjectStaticOneLock.java:Class 锁可以对类的所有对象实例起作用
- Run10_synTwoLock.java:验证
synchronized
关键字加载static
静态方法和加到非静态方法不是同一个锁
- Run10_synBlockMoreObjectOneLock.java:验证同步
- example11
- Run11_StringAndSyn.java:String 作为锁对象,常量池->同一锁
- Run11_StringAndSyn2.java:不使用 String 作为锁对象
- example12
- Run12_deadLock.java:死锁测试,jstack命令
- example13
- Run13_inner01.java:内置类和同步测试1
- Run13_inner02.java:内置类与同步测试2
- example14
- example15
- Run15_synchronized.java:
synchronized
代码块有volatile
同步的功能 - Run15_volatile.java:不使用
volatile
关键字,JVM 配置-server
- Run15_synchronized.java:
- example16
- Run16_volatile.java:
volatile
非原子的特性
- Run16_volatile.java:
- example1
- Run1_TwoThreadTransData.java:不使用等待/通知机制实现线程间通
- example2
- Run2_noObjectLock.java:没有“对象监视器”,调用
wait()
方法出现运行时异常 - Run2_notify.java:
notify
实现通知,notify
调用后,并不会立即释放对象锁,而是退出synchronized
代码块后 - Run2_sleep.java:测试
sleep()
期间其他线程是否执行 - Run2_wait.java:
wait()
永远阻塞
- Run2_noObjectLock.java:没有“对象监视器”,调用
- example3
- Run3_notifyAll.java:唤醒多个线程
- Run3_notifyMany.java:通知多个线程
- Run3_notifyOne.java:通知一个线程
- example4
- Run4_waitHasParam.java:
wait(long)
使用,超时自动唤醒 - Run4_waitHasParam2.java:
wait(long)
使用,时间限制内由其他线程唤醒
- Run4_waitHasParam.java:
- example5
- Run5_notify.java:
notify
正常通知 - Run5_notifyEarly.java:
notify
通知过早
- Run5_notify.java:
- example6
- Run6_waitOld.java:
wait
等待条件变化
- Run6_waitOld.java:
- example7
- Run7_ProducerAndConsumer_One.java:生产者/消费者模式,一生产一消费
- example8
- Run8_allWait.java:多生产与多消费,假死
- example9
- Run9_oneP_manyC.java:一生产与多消费
- Run9_oneP_oneC.java:一生产与一消费
- example10
- Run10_oneP_manyC.java:一生产与多消费
- example11
- Run11_manyP_manyC.java:多生产与多消费
- Run11_manyP_oneC.java:多生产与一消费
- Run11_oneP_manyC.java:一生产与多消费
- example12
- Run12_pipeInputOutput.java:通过管道进行线程间通信:字节流
- example13
- Run13_wait_notify_insert.java:等待/通知,交叉执行
- example14
- Run14_join.java:
join
示例 - Run14_joinExption.java:
join
的异常 - Run14_joinLong.java:
join(long)
设定等待的时间,join(long)
和sleep(long)
运行效果并无区别,但对同步的处理不同
- Run14_join.java:
- example15
- Run15_join_sleep.java:
join(long)
和sleep(long)
的区别,sleep(long)
方法不释放锁 - Run15_join_sleep_2.java:
join(long)
和sleep(long)
的区别,join(long)
释放锁 - Run15_joinMore.java:方法
join
后面的代码提前运行
- Run15_join_sleep.java:
- example16
- Run16_InheritableThreadLocalExt.java:类
InheritableThreadLocal
使用,值继承,子线程从父线程取得值 - Run16_InheritableThreadLocalExt2.java:类
InheritableThreadLocal
使用,值继承再更改 - Run16_ThreadLocal.java:验证线程变量的隔离性
- Run16_InheritableThreadLocalExt.java:类
- example1
- Run1_UseConditionWaitNotify.java:使用 Condition 实现等待通知,Condition 对象的
await()
方法,线程WAITING
- Run1_UseConditionWaitNotifyError.java:
IllegalMonitorStateException
,监视器出错 - Run1_UseConditionWaitNotifyOk.java:正确使用Condition实现等待通知
- Run1_UseConditionWaitNotify.java:使用 Condition 实现等待通知,Condition 对象的
- example2
- Run2_MustUseMoreCondition.java:使用多个 condition 实现通知部分线程
- example3
- Run3_ConditionManyToMany.java:实现生产者/消费者模式,多对多交替打印
- example4
- Run4_Fair.java:公平锁测试,打印结果呈有序状态
- Run4_notFair.java:非公平锁测试,打印结果乱序,先启动的线程不一定先获得锁
- example5
- Run5_getHoldCount.java:测试方法
int getHoldCount()
- Run5_getQueueLength.java:测试方法
int getQueueLength()
- Run5_getWaitQueueLength.java:测试方法
int getWaitQueueLength(Condition condition)
- Run5_getHoldCount.java:测试方法
- example6
- Run6_hasQueueThread.java:测试方法
boolean hasQueueThread(Thread thread)
和boolean hasQueueThreads()
- Run6_hasWaiters.java:测试方法
boolean hasWaiters(Condition)
- Run6_hasQueueThread.java:测试方法
- example7
- Run7_isFair.java:测试方法
boolean isFair()
- Run7_isHeldByCurrentThread.java:测试方法
boolean isHeldByCurrentThread()
- Run7_isLocked.java:测试方法
boolean isLocked()
- Run7_isFair.java:测试方法
- example8
- Run8_lockInterruptibly1.java:测试方法
void lockInterruptibly()
- Run8_lockInterruptibly2.java:测试方法
void lockInterruptibly()
- Run8_tryLock.java:测试方法
boolean tryLock()
- Run8_tryLock_param.java:测试方法
boolean tryLock(long timeout,TimeUnit unit)
- Run8_lockInterruptibly1.java:测试方法
- example9
- Run9_awaitUniterruptibly1.java:测试方法
awaitUniterruptibly()
- Run9_awaitUniterruptibly2.java:测试方法
awaitUniterruptibly()
- Run9_awaitUntil1.java:测试方法
awaitUntil()
- Run9_awaitUntil2.java:测试方法
awaitUntil()
- Run9_awaitUniterruptibly1.java:测试方法
- example10
- Run10_condition.java:Condition 实现顺序打印
- Run10_ReadWriteLockBegin1.java:类
ReentrantReadWriteLock
的使用:读读共享 - Run10_ReadWriteLockBegin2.java:类
ReentrantReadWriteLock
的使用:写写互斥 - Run10_ReadWriteLockBegin3.java:类
ReentrantReadWriteLock
的使用:读写互斥
- example1:
schedule(TimerTask task, Date time)
测试- Run1_timer1.java:在未来执行的效果,Timer 的构造方法会新启一个线程,且非守护线程
- Run1_timer2.java:在未来执行的效果,Timer 的构造方法会新启一个守护线程,迅速结束,task任务未被执行
- Run1_timer3.java:提前运行的效果
- Run1_timer4.java:多个 TimerTask 任务及延时
- Run1_timer5.java:多个TimerTask任务及延时,队列的方式,一个一个被顺序执行,前面一个耗时长则后面的任务被延后
- example2:
schedule(TimerTask task, long delay, long period)
测试- Run2_period1.java:在未来执行的效果
- Run2_period2.java:提前运行的效果
- Run2_period3.java:任务执行时间被延时
- example3
- Run3_cancel1.java:
TimerTask
类的cancel()
方法,将自身从任务队列移除,其他任务不受影响 - Run3_cancel2.java:
Timer
类的cancel()
方法,全部任务被清除,且进程被销毁 - Run3_cancel3.java:
Timer
类的cancel()
方法,有时不一定会停止计划任务
- Run3_cancel1.java:
- example4
- Run4_schedule1.java:
schedule(TimerTask task, long delay)
方法 - Run4_schedule2.java:
schedule(TimerTask task, long delay, long period)
方法 - Run4_schedule3.java:
schedule(TimerTask task, Date firstTime, long period)
方法 - Run4_schedule4.java:
schedule(TimerTask task, long delay, long period)
方法 - Run4_schedule5.java:
schedule(TimerTask task, Date firstTime, long period)
方法 - Run4_schedule6.java:
schedule(TimerTask task, long delay, long period)
方法 - Run4_schedule_vs_scheduleAtFixedRate_1.java:schedule 不具有追赶执行性
- Run4_schedule_vs_scheduleAtFixedRate_2.java:scheduleAtFixedRate 具有追赶执行性
- Run4_scheduleAtFixedRate1.java:
scheduleAtFixedRate(TimerTask task, Date firstTime,long period)
方法 - Run4_scheduleAtFixedRate2.java:
scheduleAtFixedRate(TimerTask task, long delay, long period)
方法 - Run4_scheduleAtFixedRate3.java:
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
方法 - Run4_scheduleAtFixedRate4.java:
scheduleAtFixedRate(TimerTask task, long delay, long period)
方法
- Run4_schedule1.java:
- example1
- Run1_singleton0.java:立即加载/“饿汉模式”
- Run1_singleton1.java:延迟加载/“懒汉模式”(会出问题)
- Run1_singleton2.java:延迟加载/“懒汉模式”缺点展示
- example2:延迟加载/“懒汉模式”解决方案
- Run2_singleton1.java:声明
synchronized
关键字,整个方法上锁 - Run2_singleton2.java:声明
synchronized
关键字,同步代码块 - Run2_singleton3.java:声明
synchronized
关键字,部分代码上锁 - Run2_singleton4.java:DCL 双检查锁机制
- Run2_singleton1.java:声明
- example3
- Run3_singleton1.java:使用静态内置类实现单例模式
- Run3_singleton2.java:序列化与反序列化的单例模式实现
- Run3_singleton3.java:使用
static
代码块实现单例模式 - Run3_singleton4.java:使用
enum
枚举数据类型实现单例模式 - Run3_singleton5.java:使用
enum
枚举数据类型实现单例模式
- example1
- Run1_state1.java:验证
NEW,RUNNABLE
,TERMINATED
- Run1_state2.java:验证
TIMED_WAITING
- Run1_state3.java:验证
BLOCKED
- Run1_state1.java:验证
- example2
- Run2_autoAddGroup.java:线程组自动归属特性
- Run2_getGroupParent.java:获取根线程组,JVM 根线程组就是 system
- Run2_groupAddThread.java线程对象关联线程组,一级关联
- Run2_groupAddThreadMoreLevel.java:线程对象关联线程组,多级关联
- Run2_threadRunSyn.java:使线程具有有序性
- example3
- Run3_formatError.java:
SimpleDateFormat
类非线程安全 - Run3_formatOK1.java:
SimpleDateFormat
类非线程安全,解决异常方法一 - Run3_formatOK2.java:
SimpleDateFormat
类非线程安全,解决异常方法二
- Run3_formatError.java:
- example4
- Run4_threadCreateException.java:线程中出现异常
- Run4_threadCreateException2.java:线程中出现异常,捕捉
- Run4_threadCreateException3.java:线程中出现异常,捕捉
- example5
- Run5_threadGroup1.java:线程组内处理异常
- Run5_threadGroup2.java:线程组内处理异常
- example6