高并发线程安全问题


高并发线程:
1、当多个线程访问同一个共享对象时,就是高并发线程。如,天猫双十一等。因为线程的调度是抢占式的,当一个线程在访问共享数据(可以是多行代码也可以是成员变量)时,其他线程也参与了该共享数据的运算,就会造成数据污染,即线程安全

2、常见的高并发线程安全问题;
前提:
确定是否存在线程安全问题,即多个线程访问同一个共享数据;
多线程运行内存分配:
共享数据存在于方法区中的静态区中,每条子线程在执行线程任务时,都会在栈区中开辟自己的内存空间。子线程在运算共享数据时,会将该数据copy一份到自己的内存空间中进行运算然后将运算后的数据发送至静态区中;

a、可见性
当多条线程在运算同一共享数据时,某条线程更改了共享数据,但是其他线程不知道,没有使用更改后的数据,这时就会出现线程安全问题;

b、有序性
当线程中共享数据的编译顺序出现差错时,即不是按照从上至下的顺序的执行。就会出现线程问题。

c、原子性
避免编译的互斥性,即线程在运算共享数据的过程中,要么执行完毕、要么不执行,不会出现编译半途中端而去执行其他线程中的该共享数据。

解决方式:
a、volatile关键字:
用volatile关键字修饰共享变量可以解决有序性和可见性问题
static volatile int num = 0;
b、AtomicInteger原子类;
用原子类修饰变量,如, static AtomicInteger a = new AtomicInteger(0)
原子类共享变量,0表示a的初始值为0;该类可以解决可见性、有序性以及原子性问题;

原子类解决安全问题 :CAS机制 (如果某条线程抢到CPU,那么就会执行完代码)
1、当子线程在运算静态区中的共享数据时,会先将两个数据相比较;
如果相等,则进行子线程中的运算,然后将运算后的结果返回给静态区
如果不相等,则先将静态区中的共享数据的值给子线程,再比较两个值是否相等。。。重复执行
2、这样可以保证一条代码在执行过程中,要么执行完毕、要么不执行,不会执行到一半而中断;

当然,以上线程安全问题也可以使用同步代码块、同步方法或者Lock锁解决。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM