java是什么 volatile能使得一個非原子操作變成原子操作嗎?
volatile能使得一個非原子操作變成原子操作嗎?JAVA內(nèi)存模型是為了解決多線程環(huán)境下共享變量的一致性問題。一致性主要包括三個特征:原子性、可見性和有序性。原子性一個程序在開始時不會被其他線程中斷
volatile能使得一個非原子操作變成原子操作嗎?
JAVA內(nèi)存模型是為了解決多線程環(huán)境下共享變量的一致性問題。一致性主要包括三個特征:原子性、可見性和有序性。原子性
一個程序在開始時不會被其他線程中斷。它可以是一個操作或多個操作。操作原子性由synchronized和lock關(guān)鍵字保證;
2。Visible
當(dāng)一個線程更改共享變量的值時,其他線程可以立即感知到該更改;volatile variable可以確保變量在多線程環(huán)境中的可見性,但不能保證原子操作;
除了volatile之外,還有兩個關(guān)鍵字也可以保證可見性,所以看到synchronized可以保證Java程序中的原子操作,如果在這個線程中觀察到,所有操作都是有序的;如果在另一個線程中觀察到,所有操作都是無序的。前半句是指線程中序列化的語義,后半句是指主存和工作內(nèi)存之間的指令重排序和同步延遲問題;
Java提供了兩個關(guān)鍵字:volatile和synchronized來保證順序。