image.png
锁的作用
image.png

生产者消费者模型

简单的多线程 - 图3

1.用锁实现生产者消费者模式

2.用无锁队列实现
https://my.oschina.net/u/1765168/blog/1807887
好鸡巴复杂,还好java作为最强的语言 jdk内自带了无锁队列

ConcurrentLinkedQueue
我们几秒钟秒实现一个 生产者 消费者模式 用这个写个简单多线程的爬虫。

在web开发中的并发实践

1.不要使用成员变量
2.用并发容器 原子变量

1.高并发实践

如何处理超卖
https://www.yuque.com/loafer/qcy9n4/yfkqr4
https://gitee.com/52itstyle/spring-boot-seckill/tree/master
在讲之前我们先了解一下什么是事务。
事务2.jpg

  • m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。
  • min_trx_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是m_ids中的最小值。
  • max_trx_id:表示生成ReadView时系统中应该分配给下一个事务的id值。

    小贴士: 注意max_trx_id并不是m_ids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的事务提交了。那么一个新的读事务在生成ReadView时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。

  • creator_trx_id:表示生成该ReadView的事务的事务id

    小贴士: 我们前边说过,只有在对表中的记录做改动时(执行INSERT、DELETE、UPDATE这些语句时)才会为事务分配事务id,否则在一个只读事务中的事务id值都默认为0。

有了这个ReadView,这样在访问某条记录时,只需要按照下边的步骤判断记录的某个版本是否可见:

  • 如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值小于ReadView中的min_trx_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以该版本可以被当前事务访问。
  • 如果被访问版本的trx_id属性值大于或等于ReadView中的max_trx_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问。
  • 如果被访问版本的trx_id属性值在ReadViewmin_trx_idmax_trx_id之间,那就需要判断一下trx_id属性值是不是在m_ids列表中,如果在,说明创建ReadView时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

ACID 就这么实现了
A:原子性
C:一致性
I:隔离性
D:隔离性