线程安全问题概述
问题出现的原因:当一个线程在对共享数据进行操作且还未结束时,其他线程参与了这个共享数据的操作,就会导致线程安全问题的产生。
解决方法:当一个线程在对共享数据进行操作时,如果其他线程也需要对这个共享数据进行操作,那么需要排队。
具体解决方案
1.同步代码块
Object o = new Object()//任何一个对象都可以当锁
synchronized(o){
//需要共享数据的代码
}
2.同步方法
将需要操作共享数据的代码写在一个代码里,在方法前加synchronized
3.显式锁Lock
和synchronized一样可以解决线程安全问题,但Lock需要手动启动同步lock(),结束同步unlock(),
Lock l = new Lock();
l.lock();
//需要共享数据的代码
l.unlock();
公平锁与非公平锁
公平锁是线程在等待时排队,有序进行,而非公平锁则是顺序混乱的。