Thread线程学习02
多线程并发安全问题(线程异步编程)
产生:多个线程操作同一个资源,线程切换的不确定性,会导致线程操作资源不会按照特定的执行顺序,就会造成数据安全问题,也就是多线程并发安全问题。(可能出现死循环,导致系统奔溃)
办法:
方法一:将线程的异步编程(并发操作)改为同步编程,规定线程执行顺序,就是线程占有CPU时间片的多少。
###### 解决方法:
###### 在方法上加修饰符synchronized,称为“同步方法”,作用就是一个方法中只能允许一个线程存在,就变成了同步操作,这就很好地解决了线程并发安全问题。
就是线程A和线程B对一个同步方法进行操作,当线程A调用该方法时,因为识别到了方法上面有synchronized修饰,所以就会给方法所属的对象加上锁,如果进入方法体后,线程A失去了对CPU时间片的使用权,就会进入“阻塞状态”,重新抢夺CPU资源。而此刻线程B在抢到资源后,就会和线程A做相同的操作。所以这就确保了一个方法只能存在一个线程执行,也就很好的保证了数据安全。当线程退出方法后,就会给方法所属的对象解锁,这就可以很好的让其他线程去操作方法了!
缺点:降低了并发效率!
方法二:同步代码块:缩小同步范围,而不是给整个方法都加上同步修饰符,这样可以提高并发效率。
语法:
synchronized(同步监视器对象){
}
多个线程必须看到的是同一个“同步监视器对象”,比如可以写“this”,代表当前类的对象。当线程A抢到这个时间片后,会给这个“this”(片段所在方法所属的对象)加上锁,然后其他线程只能在外面等待,直到线程A执行完这段代码后,才能解除锁,其他线程才可以去通过抢夺时间片,获取时间,然后决定执行顺序,给对象上锁。
静态方法加synchronized修饰一定具有同步效果。即使它所在方法的对象不同,也仍然具有同步效果。
互斥锁:
当多个代码块被synchronized修饰时,并且同步监视器对象指的是同一对象,就说代码块是互斥的,多个线程不能同时在这些方法里运行。
注意:有一个线程抛异常到run方法之外,就等于杀死了这个一个线程,跟其他线程无关。

浙公网安备 33010602011771号