线程安全问题
原因
多个线程同时操作同一个数据就会出现线程安全问题
解决思想
多个线程同时只能有一个线程对数据进行操作
解决方案
方案1:同步代码块
语法:
synchronized(锁对象){
要同步的代码
}
上锁与开锁:
当某一个线程进入synchronized代码块中,其锁对象就会上锁,此时别的线程就无法进入,只能在外等待开锁
当一个线程执行完成synchronized代码块中的代码,此时锁对象就会开锁
注意:
所有的对象都可以作为锁对象
要保证多个线程的锁对象是同一对象
方案2:同步方法
语法:
访问权限修饰符 synchronized 返回值类型 方法名(形参列表){
方法体(要同步的代码)
}
注意:
同步方法的锁对象时调用该方法的对象(同步方法的锁对象就是this)
方案3:同步静态方法
语法:
访问权限修饰符 synchronized static 返回值类型 方法名(形参列表){
方法体(要同步的代码)
}
注意:
同步静态方法的锁对象是该方法所属的类的类对象
类对象:一个类被JVM加载时会产生一个类对象,该对象包含该类的所有信息,如该类的包名,类名,父类名,实现的接口名,属性数量,方法数量,方法名等信息
因为一个类只会被加载一次,所以一个类只有一个类对象
死锁(了解)
多个线程互相持有对方所需的资源
线程间通讯
方法:
唤醒
objet.notify();
作用:随机唤醒一个使用调用该方法的对象作为锁对象的线程
objet.notifyAll();
作用:随机唤醒所有使用调用该方法的对象作为锁对象的线程
休眠
objet.wait();
作用:让当前线程陷入无限期休眠
objet.wait(timeout);
作用:让当前线程有限期休眠,参数为休眠时间,单位毫秒
objet.wait(timeout, nanos);
作用:让当前线程有限期休眠,休眠时间毫秒+纳秒
wait与sleep的区别:
wait:
由object类提供的普通方法
只能在同步中使用
休眠期间会释放持有的锁对象
sleep:
由Thread类提供的静态方法
可以在同步中,也可以在同步外使用
休眠期间不会释放持有的锁对象
注意:
1,该方法由object类提供
2,只能在同步代码块或同步方法中使用
3,必须使用该同步代码块或同步方法的锁对象调用