
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
我们在上文中给大家简单介绍了Java编程开发多线程技术的一些基础知识与线程应用实践内容,而本文我们就再来了解一下,Java编程线程安全问题都有哪些。
一、线程安全问题
1)原子性
在并发编程中很多的操作都不是原子操作,在单线程环境中这3个操作都不会出现问题,但是在多线程环境中,如果不通过加锁操作,往往很可能会出现意料之外的值。
在java中可以通过synchronized或者ReentrantLock来保证原子性。
2)可见性
可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即得到这个修改的值。
为了解决多线程的可见性问题,java提供了volatile关键字,当一个共享变量被volatile修饰时,他会保证修改的值会立即更新到主存,当有其他线程需要读取时,他会去主存中读取新值,而普通共享变量不能保证其可见性,因为变量被修改后刷回到主存的时间是不确定的。
二、线程死锁
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。
当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁,两个线程各自持有不同的锁,然后各自试图获取对方手里的锁,造成了双方无限等待下去,这就是死锁。
3.上下文切换
多线程并发一定会快吗?其实不一定,因为多线程有线程创建和线程上下文切换的开销。
CPU是很宝贵的资源,速度也非常快,为了保证均衡,通常会给不同的线程分配时间片,当CPU从一个线程切换到另外一个线程的时候,CPU需要保存当前线程的本地数据,程序指针等状态,并加载下一个要执行的线程的本地数据,程序指针等,这个切换称之为上下文切换。
一般减少上下文切换的方法有:无锁并发编程,CAS算法,使用协程等方式。
多线程用好了可以成倍的增加效率,用不好可能比单线程还慢。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。