關於併發,多線程的一些理解

    一直感覺多線程和併發之類,是比較高大上的東西,稍微有點敬而遠之.但是還是要了解一下.提高一下的.


併發的概念就不說了,舉例說明吧. 2個人同時登錄一個網站,都要調用 user.login方法.就併發了.

多線程是併發的一種解決方案,併發還有很多其他層次和類別的解決方案,就不討論了.


以前一直想一個問題,我要做個用戶登錄,如果2個用戶同時登錄,就是併發了,我的login方法是否要對併發做處理呢?

其實所有方法都會有這個問題,我平時開發是否都要考慮呢?


針對這個問題,下面就記錄下我這些天的一些理解:


以tomcat爲例,默認的話會有一個連接池,有默認的連接數量等等設置.

當2個人同時登錄時,會有2個線程同時請求user.login方法. 程序同一時間只有一個線程在執行(多核CPU好像會多個,這裏不考慮)

我們用 Thread.currentThread().getName() 可以得到線程名稱.


這裏就用到了另外一個知識點, 全局變量和局部變量

全局變量,所有線程共享,

局部變量,每個線程私有.


當user.login方法,需要修改全局變量的時候,就會引發線程同步的問題了.否則可以不需要.


我們平時寫的很多方法,不考慮併發, 可能就是因爲操作的全部是局部變量,不會牽扯到線程同步的問題.

這應該也是很多人不鼓勵使用全局變量的原因.


但是我們的大部分方法,應該還是要操作數據庫,那我們需要線程同步嗎?

這其實就看是否需要線程共享數據.

例如每個人登錄系統,都需要到數據庫記錄一條日誌, 每個線程記錄自己的,互不相干,就不需要線程同步.

如果每個人登錄系統,都需要查詢已經有多少日誌,並記錄,(其他線程可能影響到當前線程的結果),則應該同步處理.


總結一下就是:

如果資源需要線程間共享,則需同步.


這裏也有特殊的情況,就像我們系統,使用oracle的序列來做主鍵id, 因爲oracle保證了序列的唯一性,所以代碼中就不用再進行同步.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章