同步代码块
同步代码块
同步代码块
锁多条语句操作共享数据,可以用同步代码块实现
格式:
synchronized(任意对象){
多条语句操作共享数据的代码
}
- 默认情况是打开的,只要一个线程进入执行代码,锁就会关闭
- 当线程执行完毕出来了,锁才会自动打开
- 锁对象对多个线程要是唯一的,才能实现多个线程间访问共享数据的安全性问题
好处和弊端:
- 好处:解决了多线程的数据安全问题
- 弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中降低程序的运行效率
同步方法
就是把synchronized关键字加到方法上
格式:
修饰符 synchronized 返回值类型 方法名(方法参数) {}
同步代码块和同步方法的区别
- 同步代码块可以锁住指定代码,同步方法是锁住方法中所有代码
- 同步代码块可以指定锁定对象,同步方法不能指定锁定对象
同步方法的锁对象是this。
同步静态方法
格式:
修饰符 static synchronized 返回值类型 方法名(方法参数){ }
- 同步静态方法的锁对象是类名.class
死锁
线程死锁是指由于两个或多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行
锁的嵌套会导致死锁:
public static void main(String[] args) {
Object objA = new Object();
Object objB = new Object();
new Thread(()->{
while (true){
synchronized (objA){
// 线程一
synchronized (objB){
System.out.println("小康同学正在走路");
}
}
}
}).start();
new Thread(()->{
while (true){
synchronized (objB){
//线程二
synchronized (objA){
System.out.println("小薇同学正在走路");
}
}
}
}).start();
}