java里volatile關鍵字有什么特性是否能保證線程安全?
1.volatile不能保證原子性。簡單說,java有所謂主內存區和線程棧,同一變量在主內存區和各個線程的棧都存在副本(一對多)。volatile提供的可見性,是說每個線程訪問用volatile修飾的變量時,volatile都保證線程能從主存區加載到當前最新的值(反之,線程修改后同步到主存的值也要保證對其他線程的可見);
2.java的volatile的語義其實不涉及cpu緩存。jvm本身是軟件抽象,已經在操作系統之上;
3.因為非原子性,volatile往往不能保證線程安全。如果只有簡單讀寫操作如set i=2, get i, 可認為安全。i++就不行,它有一次讀一次寫;4、volatile被認為是比鎖要輕,編程要簡單。可以用volatile的地方:對一個變量,更新其值的時候不依賴于當前值,且該變量不會和其他一起構成一個不可變條件。