1.等待唤醒机制:wait - notify/notifyAll
优点:节约资源
不是安全机制,是资源节约机制。
用法:
1.等待唤醒机制必须结合锁使用,也就是synchronized (Object obj){...}
2.等待唤醒要被锁调用,必须使用相同的锁
2.锁的作用与使用
锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。
一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。
锁的工作原理:
对象有一个标志位:默认为1
1.当线程1进来时,标志位被改为0
2.这时其余线程操作锁,判断标志位为0,那么不进入被锁定的代码块
3.当第一根线程操作完成锁定的代码块时,锁的标志位又改为1
4.之后其他线程再来操作锁,就可以进入了。
锁类似于 --- 火车上的厕所
锁使用注意:要找到准确的位置代码,范围可以扩大,但要注意要适当,如将无关问题的for循环包含进锁中,
那么该循环一次只能被一个线程访问,本来线程同步时可以大大降低效率,这样一来反而增加了
程序执行的效率,所以包含的位置也要适当。
建议:刚开始用往大范围加,也先不用考虑效率问题。
-------------------------------------------------------------------------------------------
锁的使用方式
1:synchronized代码块
synchronized(Object obj){
//可能存在问题的代码
}
2:synchronized修饰方法
直接在方法的修饰符上添加synchronized,标志位影响线程对方法的调用。
方法的锁后面没有参数,那么方法的锁是什么?
A.如果是静态方法,那么锁是函数所在类的class对象,即类名.class
B.如果是成员方法,那么锁是this对象,
扩展:其他同步思路:voilate关键字,实现callable接口,Future,
Executors,ExecutorService实现一个含有返回值的线程
------------------------------------------------------------------------------------
3.线程同步:指的是多个线程访问被synchronized代码块包裹的共享资源时,
在某时刻只能只能有一个线程访问该资源。
------------------------------------------------------------------------------------
4.死锁:
stop destory resume 为什么不建议使用了?
答:容易导致死锁
=====什么是死锁???
线程1持有锁A需要锁B
线程2持有锁B需要锁A
概念:
原子操作:基本类型中除了long和double不是,其他都是,
引用类型也是,32位的都是,64位的不是,引用类型操作系统底层也是32位。
思索的解决 ----- wait--notify:等待唤醒
5.线程通信;
生产者消费者模式