Кіріспе
Кейбір бағдарламалау тілдерінде айнымалыларды белгілеу үшін қолданылатын кілт сөз. Компьютерлік бағдарламалауда volatile (ұшпалы) дегеніміз – уақыт өте келе, кейбір кодтың бақылауынан тыс өзгеріске бейімділік. Ұшпалылық функция шақыру конвенцияларына әсер етеді, сондай-ақ айнымалылардың сақталу, қолжетімділік және кэштелу әдісіне де әсер етеді. C, C++, C# және Java бағдарламалау тілдерінде volatile кілт сөзі мәннің әртүрлі қолжетімділіктер арасында өзгеруі мүмкін екенін көрсетеді, тіпті ол өзгертілмегендей көрінсе де. Бұл кілт сөз компилятордың оқу немесе жазу операцияларын оңтайландыруын болдырмайды, соның салдарынан ескірген мәнді дұрыс емес пайдалану немесе жазуларды жою мүмкіндігін болдырмайды. Ұшпалы мәндер көбінесе аппараттық құрылғыларға қолжетімділікте (жадқа бейнеленген I/O) пайда болады, онда жадтан оқу немесе жадқа жазу операциялары шеткі құрылғылармен байланысу үшін қолданылады, сондай-ақ көп жіпті бағдарламалауда, мұнда басқа жіп мәнді өзгертуі мүмкін. Көп қолданылатын кілт сөз болғанына қарамастан, volatile мінез-құлқы бағдарламалау тілдері арасында айқын ерекшеленеді және оны түсіну қиын болуы мүмкін. C және C++ тілдерінде volatile, const сияқты типтік анықтама болып табылады және типтің қасиеті болып табылады. Сонымен қатар, C және C++ тілдерінде көп жіпті сценарийлердің көпшілігінде volatile жұмыс істемейді, сондықтан оны пайдалану ұсынылмайды. Java және C# тілдерінде volatile айнымалының қасиеті болып табылады және айнымалы байланысқан объектінің өзгеруі мүмкін екенін көрсетеді, және ол негізінен көп жіпті бағдарламалау үшін арналған. D бағдарламалау тілінде көп жіпті пайдалану үшін бөлек кілт сөз бар, бірақ volatile кілт сөзі жоқ.
In computer programming, volatile means that a value is prone to change over time, outside the control of some code. Volatility has implications within function calling conventions, and also impacts how variables are stored, accessed and cached. In the C, C++, C#, and Java programming languages, the volatile keyword indicates that a value may change between different accesses, even if it does not appear to be modified. This keyword prevents an optimizing compiler from optimizing away subsequent reads or writes and thus incorrectly reusing a stale value or omitting writes. Volatile values primarily arise in hardware access (memory mapped I/O), where reading from or writing to memory is used to communicate with peripheral devices, and in threading, where a different thread may have modified a value. Despite being a common keyword, the behavior of volatile differs significantly between programming languages, and is easily misunderstood. In C and C++, it is a type qualifier, like const, and is a property of the type. Furthermore, in C and C++ it does not work in most threading scenarios, and that use is discouraged. In Java and C#, it is a property of a variable and indicates that the object to which the variable is bound may mutate, and is specifically intended for threading. In the D programming language, there is a separate keyword shared for the threading usage, but no volatile keyword exists.
C++11
C++11 ISO стандартына сәйкес, `volatile` кілт сөзі тек аппараттық жадқа қолжетімділік үшін ғана арналған; оны екі жіп арасындағы байланыс үшін қолданбаңыз. Екі жіп арасындағы байланыс үшін стандартты кітапхана `std::atomic<T>` үлгілерін ұсынады.
Явада
Java бағдарламалау тілінде де volatile кілт сөзі бар, бірақ ол сәл басқа мақсатта қолданылады. Java-ның барлық нұсқаларында барлық volatile айнымалыларды оқу және жазу бойынша жаһандық реттелу бар (volatile айнымалылар бойынша бұл жаһандық реттелу, барлық синхрондау әрекеттерінің толық ретімен салыстырғанда, ішінара реттелу болып табылады). Бұл, кез келген жіп volatile өріске кіргенде, жалғастыру алдында оның ағымдағы мәнін оқитынын білдіреді, кэштелген мәнді пайдаланудың орнына. (Дегенмен, volatile оқу және жазудың, қалыпты оқу және жазумен салыстырылатын ретіне кепілдік жоқ, яғни ол көбінесе тиімді жіптік құрылым емес.) Java 5 немесе одан кейінгі нұсқаларында volatile оқу және жазу, mutex-ты алу және босату сияқты, "осыған дейін" қатынасын орнатады. volatile пайдалану құлыптан жылдам болуы мүмкін, бірақ Java 5-тен бұрын кейбір жағдайларда жұмыс істемейді. Java 5-те volatile тиімді болатын жағдайлар ауқымы кеңейтілді; атап айтқанда, екі рет тексерілген құлып енді дұрыс жұмыс істейді.
In all versions of Java, there is a global ordering on reads and writes of all volatile variables (this global ordering on volatiles is a partial order over the larger synchronization order (which is a total order over all synchronization actions)). This implies that every thread accessing a volatile field will read its current value before continuing, instead of (potentially) using a cached value. (However, there is no guarantee about the relative ordering of volatile reads and writes with regular reads and writes, meaning that it's generally not a useful threading construct.) In Java 5 or later, volatile reads and writes establish a happens before relationship, much like acquiring and releasing a mutex. Using volatile may be faster than a lock, but it will not work in some situations before Java 5. The range of situations in which volatile is effective was expanded in Java 5; in particular, double checked locking now works correctly.