
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据竞争是程序员在学习Java编程开发语言的时候需要重点关注的一个问题,而本文我们就通过案例分析来简单了解一下,数据竞争问题与竞争条件分析。
一、Java数据竞争问题
Java数据竞争问题是指至少存在两个线程去读写某个共享内存,其中至少一个线程对其共享内存进行写操作。
对于数据竞争问题,简单的理解就是,多个线程在同时对于共享内存的进行写操作时,在写的过程中,其他的线程读到数据是内存数据中非正确预期的。
产生数据竞争的原因,一个CPU在任意时刻只能执行一条指令,但是对其某个内存中的写操作可能会用到若干条件机器指令,从而导致在写的过程中还没完全修改完内存,其他线程去读取数据,从而导致结果不可预知。从而引发数据竞争问题,这个情况有点像MySQL数据中并发事务引起的脏读情况。
在Java领域中,解决数据竞争问题的方式一般是把共享内存的更新操作进行原子化,同时也保证内存的可见性。
针对上述的饥饿问题,为了解决它,JDK内部实现一系列的原子类,比如AtomicReference类等,但是主要可以采用CAS+自旋锁的方式来实现。
二、Java竞争条件问题
Java竞争条件问题是指代码在执行临界区产生竞争条件,主要是因为多个线程不同的执行顺序以及线程并发的交叉执行导致执行结果与预期不一致的情况。
对于竞争条件问题,其中临界区是一块代码区域,其实说白了就是我们自己写的逻辑代码,由于没有考虑位,从而引发的多个线程不同的执行顺序以及线程并发的交叉执行导致执行结果与预期不一致的情况。
产生竞争条件问题的主要原因,一般主要有线程执行顺序的不确定性和并发机制导致上下文切换等两个原因导致竞争条件问题,其中:
线程执行顺序的不确定性:这个线程调度的工作方式有关,现在大部分计算机的操作系统都是抢占方式的调度方式,所有的任务调度由操作系统来完全控制,线程的执行顺序不一定是按照编码顺序的,主要有操作系统调度算法决定。
并发机制导致上下文切换:在并发的多线程的程序中,多个线程会导致进行上下文的资源切换,并且交叉执行,从而并发机制自身也会引起竞争条件问题。
在Java领域中,解决竞争条件问题的方式一般是把临界区进行原子化,保证临界区的源自性,保证了临界区捏只有一个线程,从而避免竞争产生。
针对上述的饥饿问题,为了解决它,JDK内部实现一系列的原子类或者说直接使用synchronized来声明,均可实现。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。