如今框架橫行,Spring 已經(jīng)是非常成熟的容器體系,我們在日常開發(fā) JavaWeb 的工作中,大多已經(jīng)不需要考慮多線程的問題,這些問題都已經(jīng)在Spring容器中實(shí)現(xiàn),框架的意義就是讓程序員們可以專注于邏輯的實(shí)現(xiàn)。然而這種編程工作是非常無趣無味的,如果長期從事這個工作,技術(shù)不一定見長,業(yè)務(wù)知識一定很熟悉!= =但說實(shí)在的,我并不喜歡這類工作,因?yàn)檫@種工作大多情況下知識對代碼的簡單復(fù)制,或是簡單的一些編寫,并沒有什么真正的創(chuàng)造性,不會給人成就感。

  需求背景


  我們的項(xiàng)目,是 Mysql+ElasticSearch 做的一個數(shù)據(jù)庫和搜索引擎,項(xiàng)目經(jīng)理提出需要做一個用于重建 ES 搜索數(shù)據(jù)的接口,這個任務(wù)很光榮的交給了我。

  在功能的編寫過程當(dāng)中,我突然思考這樣一個問題,因?yàn)槲覀?Web 項(xiàng)目本身是多線程的,那如果在同一時間段,有多個請求同時發(fā)起,那同時發(fā)起 ES 的重建,對于 ES 來說,可能會產(chǎn)生一些莫名其妙的問題。

  所以我感到非常高興,因?yàn)檫@個問題,似乎不是聽起來的那么簡單。于是乎我想到了,要加入同步鎖了。

最開始的思考:


  最開始我只是很簡單的想,直接在對應(yīng)的 Service 層寫一個方法,然后直接加一個

synchronized(this)

在整個方法體上。    

1 @Override2     public synchronized int rebuiltBountyData() throws Exception {3         ...4     }

 

網(wǎng)友評論