JAVA之大道至简

Posted dagny

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA之大道至简相关的知识,希望对你有一定的参考价值。

java是一门面向对象的语言,虽然我比较有优势,早出生了几年。第一门语言是C语言,学得完全没什么感觉。更别谈什么学以致用了,饭碗还是靠java语言,所以至今对面向对象也没什么深刻的理解。啰嗦了几句,其实主要想表达的是,在程序猿的路上,更重要的是思考。而不是什么面向对象,什么框架,这些都只是工具。哈哈还想啰嗦一下知行合一的,想想还是算了。这么高深的道理,用文字表达不得出书。

   今天简单分析一个需求。有100万条数据存储在数据库表A,大致结构如下:

表A
客户ID 推送内容 推送状态
     
     
     

  需要推送到到某服务器,1秒推送的效率是50条,而客户希望1小时推送完成。1秒50,那一个小时也就只能推送18万笔。如果达到1小时推送完的话,那肯定得要用多线程吧。嗯不错,确实要用多线程,100/18,最起码得用6个线程。程序启动6个线程去查询数据库,怎么控制每个线程不读到重复的数据呢(重复这个问题可严重了,如果是提醒重复就是骚扰,如果是转账那重复就要钱了)

  解决方案A,在读取数据库的方法加一把同步锁,确保只有一个线程读取就可以了。那实现方法大致如下:

1、给方法加锁确保一个线程进入

2、给某取18万笔数据(怎么取呢)

3、 批量更新这18万笔数据为(正在处理状态,以防其他线程重复取)

看着是不是挺复杂,那有没有简单的办法呢?嘿嘿当然有

 解决方案B,给表A加个序号字段,要求在按顺序写入表,结构大致如下:

表A
序号 客户ID 推送内容 推送状态
1      
2      
3      
....      
1000000      

思路是不是立即就有了,线程 A 取 1~180000,线程B就取 180001~360000,就行啦,也节省锁以及更新推送中间状态的效率。再深入点,还在可以从分区上设计考虑。

 

也许你会问,别人写入的时候不愿意加序号怎么办,怎么办,凉拌!摆事实讲道理,你不提出来,别怎么知道你需要。

 
 
 

以上是关于JAVA之大道至简的主要内容,如果未能解决你的问题,请参考以下文章

大道至简之编程的精义读后感-Java伪代码

JAVA之大道至简

大道至简第一章--java伪代码读后感

《大道至简》第一章读后感--JAVA语言伪代码形式

《大道至简》第一章读后感--JAVA语言伪代码形式

《大道至简》JAVA伪代码读后感