JAVA并发编程(一)(基于计算机底层.jvm内存模型.mysql(数据搬运))


ps:前因,一直在写后台系统是没有分析和需求来做并发的思考的。但是最近接触了jvm和并发的一些知识,使我对计算机底层已经他们之间的交互有了一些了解,使我对蒙了两年多的那层美丽面庞揭开了一点可以探索的起点。

cpu.内存.磁盘

目前的计算机以摩尔定律(以超性价比的时间增长单机的性能),所以现在的我们尽量的压榨计算机的性能,尽量的不让计算空闲下来。就要使用计算机的多核处理能力。
大多数在大学学过计算机原理的同学们都知道,计算机的cpu.寄存器.内存.和磁盘。CPU处理的数据,最终要落地到磁盘,因为现在是通电式运行计算机,那么计算机没有电,内存中的数据,各级缓存中的数据都会消失。所以需要落地到磁盘。
由此可以引出,各处数据暂存之地,是有IO交互的。

问题

在带来便捷的同时,也引发了很多问题。比如一个线程读取内存中的数据放到缓存中,在该线程的缓存行中记录该缓存的信息,下次需要读取相同位置的数据,就会从缓存中读取数据,也就是缓存命中。但是这条数据,不能确定是最新的,同样该线程修改的数据,也会导致写命中,使得各线程直接无法实施的共享数据。

总结

以前我了解学习jvm,只是单纯的知道,jvm的内存分区,书中的图片说这些是数据共享的区域,这里的数据会引起并发的时候出现的问题。对计算机的具体做法不了解,使我一直以来,对这些说法,都停留在表面的认识,这也是一直挡在我面前的那层“纱”了。
昨晚,我顺着这条线索思考,我们使用的数据库.文件系统。需要我们关注的多线程共享数据的地方,这和刚才我所理解的“告诉缓存区”,是一个道理的。
java的编程中给我们提供volatile关键字,使得数据的更新和获取都是最新的,也提供给我们synchronized 关键字,使得对使用资源的锁定,在被占用锁定的同时,其它的线程无法使用。同样的思考,我们在对数据库中的数据使用,我们可以使用乐观锁,悲观锁。Inoodb引擎给我们提供了事务处理,解决并发给我们带来便利的问题。

所以我们站在这个角度去想问题,会对我们在编程中以及操作数据库可能会出现的问题,有更好的解决问题的出发点。
ps:java给我们提供了很多并发编程的工具,使得并发编程并不是很遥远,数据库的存储引擎,也都可以找到很多的资料去学习。所以希望大家跟我一样认真的学习,主动的思考。让自己不浪费光辉的岁月。
昨天晚上画了一张图,还没有整理,有点乱,周末整理一下,发出来。

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *