多線程爲什麼會發生問題:
如下圖所示,不同線程運行在不同的cpu或cpu核心中,在cpu和主存之間,還存在一層緩存,因此cpu在讀取一個變量時,會先讀取到緩存,再進入cpu的寄存器,寫入時也是如此,會先進入緩存,再寫入主存。這樣就會導致不同線程之間的衝突了。
兩者在內存中的表現
Volatile:
被Volatile修飾的變量,會越過緩存,cpu的讀寫操作直接刷到主存(通過memory barrier來實現),這樣一來,可以保證原子操作的線程安全。
Synchronized:
被synchronized修飾的代碼塊,在被一個線程讀取後,會加鎖,直到同步部分操作完成,纔會釋放鎖,其他的線程才能操作這部分主存。
優缺點:
Volatile:
- 優點:不加鎖,不會發生線程阻塞。
- 缺點:只能修飾基本類型,必須是原子操作。
Synchronized:
- 優點:能修飾變量、方法、類,能保證代碼塊操作的原子性
- 缺點:可能發生線程阻塞。