多线程之间实现同步
为什么会有线程安全问题
当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题
线程不安全问题如何解决?
使用多线程之间的同步(同步代码块:synchronized)或者使用锁(并发包:jdk1.5 lock)
使用同步代码块
同步代码块:将可能会发生线程安全问题的代码给包括起来
synchronized(同一个数据){
可能会发生线程冲突问题
}
使用synchronized包裹起来的代码每次只能让一个线程执行,且synchronized只适合单个jvm,synchronized是锁对象,并不是锁代码
使用同步方法
同步方法:在方法上修饰synchronzied成为同步函数
同步函数使用的this锁
静态同步方法
静态同步方法:方法加上static关键字,使用synchronized关键字进行修饰(当class文件也是字节码文件被加载时,才会被初始化)
静态的同步函数使用的锁是该函数所属字节码文件对象
可以用getClass方法获取,也可以用当前类名.class表示
线程死锁
多线程死锁:同步中嵌套同步,导致锁无法释放
比如A用this之后再拿到oj锁才能运行(锁名不必在意),B需要先拿oj锁后再拿this锁后才能运行,那如果当程序运行到某一刻A拿到了this锁,B拿到了oj锁。A在等B释放oj锁才能运行,B在等A释放this锁才能运行。两方互相等待,谁都不先释放,这就成了死锁