《java多线程编程核心技术》知识点总结

第一章 多线程技能

1.进程可以理解为运行中的一个exe程序,是操作系统管理的基本单元。而线程则是在进程中独立运行的子任务(例如,QQ可以理解为一个进程,QQ下进行的下载,发图片等任务则可以理解为是一个线程)。
2.想要实现多线程编程,可以选择继承Thread类或者实现Runnable接口,重写父类的run()方法,在实例中调用start()方法即可。
3.线程的调用具有随机性,调用start()方法即是讲线程交予线程规划器安排(即程序并不一定按照start方法的调用顺序执行),随机运行,但是如果直接调用run()方法则无法异步执行。
4.i–和i++没有实现线程安全。
5.停止线程使用interrupt()方法最佳,调用后线程不一定立即停止。最好不要使用stop()方法停止线程,强制停止容易造成错误,也尽量不要使用suspend()和resume()方法去暂停异常(具有独占性,占用资源)。可以捕获interruptedException异常或者使用return()来停止线程。
6.线程的优先级具有继承特性。具有高优秀级的并不一定优先运行。
7.Daemon可以创建守护线程,伴随线程一同结束。
8.Thread类的常用方法:https://www.jianshu.com/p/13addbedc965

第二章 对象及变量的并发访问

1.Synchronized关键字是对象锁,锁方法时等同于在方法内锁this对象。
2.用Synchronized关键字锁定的对象,同一时间只有一个线程能够访问锁定的方法或者代码块,释放锁后随即由下一个线程执行。
3.多个对象多个不同的锁,仍然具有非线程安全问题。
4.Synchronized锁定的方法内变量线程安全,全局变量仍然线程不安全。
5.出现异常时,锁自动释放。
6.锁定内容外的部分,依旧异步执行。
7.Synchronized关键字加载静态方法上相当于Class锁,对所有的实例对象起作用。
8.数据类型String的常量池特性:“123”和“123”在内存中是同一个对象,即内存中只会保存内容相同的字符串实例一个,开发中尽可能不要使用String锁,可以选择使用Object锁。
9.jdk自带检测死锁的工具。
10.volatile关键字的作用:是线程不再从私有栈堆读取数据,直接从公共栈堆读取,实现了多线程环境下的数据可见性。但是volatile关键字不具有原子性。
在这里插入图片描述
11.原子类也不是线程安全的,方法和方法间的调用不是原子的。
12.Synchronized代码块可以实现互斥性和可见性。

第三章 线程间通信

1.调用notify()方法会通知处于wait()阻塞状态的线程争抢锁,获取资源。
2.调用wait()方法的线程会立刻释放对象锁。
3.当线程被通知,获得锁后处于就绪状态,等待cpu分配资源进入运行。
4.生产者消费者模式:https://www.cnblogs.com/wyq178/p/7604674.html
5.join()方法等待线程对象销毁。
6.ThreadLocal可以实现每一个线程都具有自己的共享变量。InheritableThreadLocal可以再子线程中获取父线程的值。

第四章 Lock的使用

1.jdk1.5之后增加了Lock锁,能实现Synchronized关键字的作用,而且扩展功能更加强大:嗅探锁定,多路分支通知等。
2.ReentrantLock()类实例可以调用lock()方法上锁,unlock()解锁。
3.使用Condition对象可以对指定的线程进行通知 ,通过lock类的newCondition方法可以实例化一个condition对象。使用condition.await()方法可以获得锁(对象监视器),用signal()方法可以通知线程。
4.不要使用if判断条件,要使用while(不能及时通知):https://blog.csdn.net/qq_26483671/article/details/79263502
5.锁Lock分为公平锁和非公平锁:公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的;非公平锁则是随机的。
6.Lock类的常用方法:https://blog.csdn.net/zezezuiaiya/article/details/80910827
7.ReetrantReadWriteLock类可以实现多个读锁间不互斥,读锁和写锁互斥,写锁与写锁互斥,从而提高效率。

第五章 定时器Timer

1.Timer类主要负责计划任务的功能。TimerTask类(抽象类)负责封装任务。
2.运行schedule(TimerTask task,Date time)方法来实现任务规划。但是任务执行的时间可能与预期不符,因为部分任务的执行可能消耗时间较长,导致后面的任务被延迟。
3.cancel()方法可以将自身从任务列表中清除。

第六章 单例模式与多线程

1.立即加载(饿汉模式):使用类的时候就已经创建对象实例。
2.延迟加载(懒汉模式):调用get()方法的时候才去创建实例。
3.多线程环境中,要考虑对象的实例过程是否是线程安全的。
4.DCL双检查锁机制:在这里插入图片描述
5.使用静态内置类同样可以解决延迟加载的单例问题
6.在反序列化中使用readResolve()方法可以解决非线程安全问题。

第七章 查漏补缺

1.可以给线程归组:https://blog.csdn.net/qq_41723615/article/details/88790058
2.SimpleDateFormat非线程安全

java多线程面试题汇总:https://blog.csdn.net/zl1zl2zl3/article/details/81868173
https://blog.csdn.net/ll666634/article/details/78615505

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值