java解决线程不安全问题的方法
2017-07-10 21:56
351 查看
线程不安全问题
当多线程并发访问同一个资源时,容易出现不安全问题 有时候我们分析打印结果,发现没有问题,但是并不是真的没问题,可能我们经验不够,没有发现问题。为了放大问题是用Thread中的sleep()方法
Thread.sleep(100); //是当前线程睡眠100毫秒,让其他线程去抢资源,经常用来模拟网络延迟。放大线程中的问题。
解决方法:
(1)同步代码块
(2)同步方法
(3)锁机制(Lock)
1.同步代码块
synchronized( 同步锁){ //同步锁:同步监听对象/ 同步监听器 /互斥锁
需要同步操作的代码
}
对象的同步锁只是一个概念,可以想象在对象上标记 一个锁
java程序运行可以使用任何对象作为同步监听对象,但是一般我们将当前i并发访问的共同资源(多个线程同步共享的资源对象)作为同步监听对象。
注意:在任何时候,只允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他线程只能在外面等
2.同步方法
使用synchronized修饰的方法叫做同步方法,保证该线程执行该方法的时候,其他线程只能等着。
同步锁:1.非static方法,同步锁是this。2.static方法,使用当前方法所在类的字节码对象(Apple.class)是同步锁
注意:
synchronized不能修饰run方法,修饰之后,一个线程就执行了所有的功能,线程出现串行,相当于单线程。
解决方法:将需要同步的 代码定义在一个新的方法中,并且该方法用synchronized修饰,再在run方法中调用该新的方法即可
synchronized提高安全性,但是性能降低了,使用时尽量减小它的作用域。eg:stringBuffer和StringBuilder的区别,[b]stringBuffer的方法全都加了[b]synchronized修饰。[/b][/b]
类似的还有:ArrayList和vector HashMap和Hashtable 一般选择使用性能比较高的。
**单例模式-懒加载同步
一般懒汉式
优化懒汉式
饿汉式
结论:单例模式使用 饿汉式;简单粗暴。
3.锁机制(Lock)
Lock是一个接口,实现提供更广泛的锁定操作可以比使用synchronized获得方法和报表。
锁是一种通过多个线程控制对共享资源的访问的工具。通常,一个锁提供对共享资源的独占访问:在一个时间只有一个线程可以获得锁和所有访问共享资源,需要先获得锁。
谢谢阅读!
当多线程并发访问同一个资源时,容易出现不安全问题 有时候我们分析打印结果,发现没有问题,但是并不是真的没问题,可能我们经验不够,没有发现问题。为了放大问题是用Thread中的sleep()方法
Thread.sleep(100); //是当前线程睡眠100毫秒,让其他线程去抢资源,经常用来模拟网络延迟。放大线程中的问题。
解决方法:
(1)同步代码块
(2)同步方法
(3)锁机制(Lock)
1.同步代码块
synchronized( 同步锁){ //同步锁:同步监听对象/ 同步监听器 /互斥锁
需要同步操作的代码
}
对象的同步锁只是一个概念,可以想象在对象上标记 一个锁
java程序运行可以使用任何对象作为同步监听对象,但是一般我们将当前i并发访问的共同资源(多个线程同步共享的资源对象)作为同步监听对象。
注意:在任何时候,只允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他线程只能在外面等
2.同步方法
使用synchronized修饰的方法叫做同步方法,保证该线程执行该方法的时候,其他线程只能等着。
同步锁:1.非static方法,同步锁是this。2.static方法,使用当前方法所在类的字节码对象(Apple.class)是同步锁
注意:
synchronized不能修饰run方法,修饰之后,一个线程就执行了所有的功能,线程出现串行,相当于单线程。
解决方法:将需要同步的 代码定义在一个新的方法中,并且该方法用synchronized修饰,再在run方法中调用该新的方法即可
synchronized提高安全性,但是性能降低了,使用时尽量减小它的作用域。eg:stringBuffer和StringBuilder的区别,[b]stringBuffer的方法全都加了[b]synchronized修饰。[/b][/b]
类似的还有:ArrayList和vector HashMap和Hashtable 一般选择使用性能比较高的。
**单例模式-懒加载同步
一般懒汉式
优化懒汉式
饿汉式
结论:单例模式使用 饿汉式;简单粗暴。
3.锁机制(Lock)
Lock是一个接口,实现提供更广泛的锁定操作可以比使用synchronized获得方法和报表。
锁是一种通过多个线程控制对共享资源的访问的工具。通常,一个锁提供对共享资源的独占访问:在一个时间只有一个线程可以获得锁和所有访问共享资源,需要先获得锁。
谢谢阅读!
相关文章推荐
- Java SimpleDateFormat 线程不安全问题及解决方法
- Java线程安全问题及线程安全解决方法
- Java线程安全问题,方法及内存模型
- 13.8 线程的安全问题和解决方法
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 浅谈利用同步机制解决Java中的线程安全问题
- java静态方法之线程安全问题
- java中如何解决线程不安全的问题呢?
- java线程安全之synchronized同步代码块解决脏读问题(四)
- JAVA基础再回首(二十四)——多线程的概述、实现方式、线程控制、生命周期、多线程程序练习、安全问题的解决
- java 多线程(线程间通信-解决安全问题)
- Java之——SimpleDateFormat 线程不安全问题及解决方法
- 线程安全问题出现的原因和解决方法
- java中同步synchronized的意义,如何用它解决线程不安全的问题
- Java线程同步卖票问题解决方法
- 程序中和有js函数的网页交互,线程中调用 get_Script 就会错误的解决方法,由于COM的线程安全问题
- java通过代码控制线程状态,解决线程不安全的问题。
- 黑马程序员--JAVA基础复习之多线程(二)线程安全与解决方法
- 完美解决Java中的线程安全问题
- Java中创建线程的两个方法____解决火车票或售票问题