线程不安全的问题怎么解决?
synchronized和lock都能解决线程不安全的问题
一、synchronized
三种同步方式:同步代码块(使用自定义明锁)、同步函数(使用this锁)、同步静态函数(使用字节码文件,即类.class)
- synchronized使用的有哪些关键字呢?
wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。
- sleep() 和 wait()区别?
sleep()在Thread类中,wait()在Object类中;
sleep不会释放锁,而wait()则会释放锁,调用notify()后才会进入运行状态;
二、lock
为什么会有lock锁?
解决了synchronized不能手动上锁开锁的问题
jdk1.5以上并发包 有:lock、线程池Executors、Condition
写法为:
Lock lock = new ReentrantLock();
lock.lock();
try{
//可能会出现线程安全的操作
}finally{
//一定在finally中释放锁
//也不能把获取锁在try中进行,因为有可能在获取锁的时候抛出异常
lock.ublock();
}
Condition类的使用似于synchronized中的 wait()和notify(),用法如下:
Condition condition = lock.newCondition();
res. condition.await(); 类似wait
res. Condition. Signal() 类似notify
Signalall notifyALL
三、synchronized和lock区别
synchronized不需要释放锁,lock需要开锁释放锁