线程安全
原因:
在多个线程操作同一个资源的时候,会导致数据不安全
名词介绍:
同步: 同时只能被一条线程所执行 ( 线程是安全的)
异步: 同时可以有多个线程执行数据 ( 线程是不安全的)
解决:
思路:
保证同时只能有一条线程在操作数据,并且锁对象是同一个
方案一:
同步代码块
语法:
synchronized (锁对象){
要同步的代码块;
}
注意:
锁对象 可以是任意一个类的对象
方案二:
同步方法
语法:
权限修饰符 synchronized 返回值类型 方法名 (形参列表){
方法体;
返回值类型;
}
注意:
锁对象: 谁调用同步方法 谁就是锁对象
方案三:
同步静态方法
语法:
权限修饰符 static synchronized 返回值类型 方法名 (形参列表) {
方法体:
返回值类型
}
注意:
锁对象就是该类的对象
死锁(了解)
为什么会产生死锁?
因为多个线程相互需要对方所死锁的资源,相互都进入等待状态
怎么避免:
尽量在同步中不使用同步
线程的休眠 与 唤醒
休眠:
有限期休眠: sleep() wait()
无限期休眠:wait()
注意: sleep 和 wait 的区别
相同点:
两者都可以对线程进行休眠
休眠单位都是毫秒为单位
不同点:
sleep:
对线程进行休眠的时候不可以释放锁
调用对象只能是Thread 或 其对象
可以在任意位置进行调用
wait:
对线程进行休眠的时候会释放锁
只能使用该方法 或者 调用该方法的对象对其调用
只能在同步方法或者同步代码块中调用
属于Object类提供的方法
wait() 括号中没有任何参数 那么就是无限期休眠
唤醒
对象.notify()随机唤醒一个使用该对象作为锁对象的线程
对象.notifyAll() 唤醒全部使用该对象做为锁对象的线程
::总结::
为什么要使用同步?
保证多个线程操作数据的时候不会出现错乱
如何解救?
使用同步的方法解决
同步的三种方案?
1.同步代码块:
锁对象由我们自己创建
2.同步方法:
锁对象是该方法 或者 调用该方法的对象
3.静态同步方法 :
锁对象就是该类对象
使用同步需要注意的是什么?
1.分析需要同步的地方
2.保证锁对象是同一个
3.避免死锁
线程之间的通讯?
休眠:
让线程进入休眠状态,不在争夺cpu的执行权
唤醒:
让线程从休眠状态转换成就绪状态,准备抢夺cpu的执行权