一:线程同步
当多个线程共享数据时就会发生安全性问题,而解决这个问题,就需要通过线程同步这个机制来解决。
1.什么是线程同步:
解决数据共享问题,必须使用同步,所谓同步就是指多个线程在同一时间段之内只能有一个线程执行指定代码,
其他线程要等待此线程执行完成之后才可以继续执行。
"加锁->修改->释放锁",任何线程在修改指定资源之前,首先对该资源加锁,在加锁期间其他线程无法修改该
资源,当该线程修改完成后,该线程释放对该资源的锁定,通过这种方式就可以保证并发线程在任一时刻只有一个线程
可以对共享资源进行操作。
2.线程同步的2种方法:
(1)同步代码块
synchronized(要同步的对象){
要同步的操作;
}
(2)同步方法
public synchronized void method(){
要同步的操作;
}
使用原则:如果所有代码都需要同步,则使用同步方法,否则使用同步代码块。
3.同步准则:
线程同步会导致性能降低,但为提高数据安全性,必须进行同步。同步准则如下:
(1)不要对所有方法进行同步,把不需要同步的代码放在代码块外面。
(2)不要阻塞,如IO操作
(3)在持有锁的时候不要调用其他同步方法,否则会造成线程死锁
(3)单线程环境使用线程不安全的以保证性能,多线程环境下使用线程安全的。
4.线程死锁:
当两个线程相互等待对方释放同步监视器时就会发生死锁,java虚拟机没有监测,也没有采取措施来处理死锁
情况,所以多线程编程时应该采取措施避免死锁现象。一旦出现死锁,整个程序既不会发生任何异常,也不会给出、
任何提示,只是所有线程处于阻塞状态,无法继续。
多线程中要进行资源共享,就需要同步,但过多的同步,就可能造成死锁。