并发问题java

两个重要的概念:同步和异步

同步,按照流程顺序一步一步的执行,等待获取单步的返回结果并执行下一步;发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

同步在一定程度上可以看做是单线程,这个线程请求一个方法后就待这个方法给他回复,否则他不往下执行(死心眼)。

异步,按照流程顺序一步一步的执行,不等待单步的返回结果就执行下一步;发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

 异步在一定程度上可以看做是多线程的(废话,一个线程怎么叫异步),请求一个方法后,就不管了,继续执行其他的方法。

并发

并发,同时对同一对象或者数据进行操作。

脏数据

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这
个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据(Dirty Data),依据脏数据所做的操作可能是不正确的。

数据为2,A操作+1,B操作*2;

正常情况A->B:2+1 =3,3*2=6,结果为6;

非正常情况AB并发:2+1 =3,2*2=4,结果为4;2*2=4,2+1 =3,结果为3;2*2=4,4+1 =5,结果为5;

并发问题的解决方法--个人理解

1、流程性的问题

第一种:开发人员必知的方法:java中的同步锁,典型的就是同步关键字synchronized

第二种:数据处理方法:增加上锁表,读取上锁表的记录判断是否上锁;使用Redis等加锁,控制单一操作;

2、数据性的问题

第一种:数据版本方式,增加类似版本字段,通常使用创建时间时间戳,并在update时校验。

未完待续。

原文地址:https://www.cnblogs.com/huasky/p/7489657.html