一、定义
当两个或多个线程需要访问同一资源时,需要以某种顺序来确保该资源某一时刻只能被一个线程使用
二、实现线程同步的方法
同步方法( synchronized )
同步代码块( synchronized)
三、同步代码块
同步代码块:synchronized放在对象前面限制一段代码的执行
语法格式:
synchronized(对象)//这个对象可以为任意对象 ,该对象就是锁
{
需要被同步的代码
}
同步条件
必须要有两个或者两个以上的线程
缺点:
多个线程需要判断锁,较为消耗资源
四、锁
互斥锁
同一时刻只能有一个线程占用,其他线程要等这个线程执行完释放锁以后才能使用锁
任意锁
可以是任意类型对象
多个线程必须使用同一个锁 , 才能起到互斥的作用
同步中的锁
同步代码块:this或其他共同对象
非静态方法:this
静态方法:类.class
注意:
任意锁和互斥锁是同一个锁,只是从不同角度出发,定义为不同的锁。任意锁:指对象类型可以任意;互斥锁指锁一次只能让一个线程用
五、同步方法
同步非静态方法
synchronized放在方法声明中,表示整个方法为同步方法,锁定this对象,如果有一个线程进入了该方法,其他线程要想使用当前this对象的任何同步方法,都必须等待前一个线程执行完该同步方法之后
同步静态方法
synchronized放在static方法声明中,表示锁定该类的class对象(Xxx.class,是Class类型的,是描述一个类的信息的对象)
如果有一个线程进入了该方法,其他线程要想使用当前类中的任何同步静态方法,都必须等待前一个线程执行完该同步方法之后;其他非同步方法及非静态的同步方法的执行不受影响
六、锁的选择
多个线程共享资源,为了保证数据安全,需要同步
一般情况下选择资源作为锁(必须为引用类型)即可,也可以选择其他唯一的对象
七、死锁
线程双方都持有者自己的锁不放,还想要对象的锁,僵持着,于是产生死锁
死锁发生的条件
同步中嵌套同步
锁不同
八、守护线程
1)在Java中有两类线程
User Thread(用户线程或前台线程)
Daemon Thread(守护线程或后台线程)
2)其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了
3)设置守护线程的方法要写在 start前面
4)子线程设置成为守护线程, 当主线程 执行完了,子线程就结束执行
5)线程对象.setDaemon(true) 默认为false