Не за това, гол свирецо!
Ей, Рабинка, туй ИИ-то било голема работа
Ей, Рабинка, туй ИИ-то било голема работа
Да, точно това обяснява Ребата. На някой, който претендира, че е писал индустриален софтуер.
Реално козоеба няма никаква идея от каквото и да е програмиране. Пълна скръб.
Май пак не си разбрал що е то volatile, къде и кога се ползва И най вече какво точно прави компилатора като го види.
Изключва оптимизациите. Които пречат да цъкаш порт на контролер, 0 - 1 - 0 го оптимизира до твърда нула. Лично проверено.
Макя ти фостенцата.
Колкото и да псува козоеба, фактът, че не разбира от програмиране остава непроменен.
Но канадското говедо може и да е по-неграмотно дори и от него. Което е доста шокиращо.
Тц, не ги изключва. Т.е. изключва само някои оптимизации. Като не си наясно какво и защо прави няма да си наясно и къде и как да го ползваш.
Локалния модел ми изплю това за volatile, като го питах.
Here's a clear, practical explanation of volatile
in Java**, with a concrete example and key caveats:
-
volatile
Does**
- Ensures visibility** of variable changes across threads.
- Prevents thread-local caching** (e.g., a thread doesn’t keep a stale copy in its CPU cache).
- Does NOT provide atomicity** (e.g., count++
is still not thread-safe with volatile
).
- Does NOT prevent race conditions** (only ensures latest value is seen).
> 💡 Simple Analogy**:
> Without volatile
, Thread A might "see" an old value of flag
from its local cache (like a teammate not checking your latest text message).
> With volatile
, Thread A always checks the "official" flag
(like reading your latest message directly).
-
volatile
(Broken!)**
public class VolatileExample {
private static boolean isRunning = false; // NOT volatile!
public static void main(String[] args) {
// Thread 1: Sets isRunning to true
new Thread(() -> {
System.out.println("Thread 1: Setting isRunning = true");
isRunning = true;
}).start();
// Thread 2: Checks isRunning in a loop
new Thread(() -> {
while (!isRunning) {
// Busy-wait until isRunning becomes true
}
System.out.println("Thread 2: Exit loop (isRunning is now true!)");
}).start();
}
}
What happens?**
- Thread 2 may never exit** the loop!
- Why? Thread 2’s CPU cache holds the old value (`false`), even though Thread 1 updated isRunning
to true
in main memory.
- This is a classic race condition** (caused by caching, not atomicity).
-
volatile
public class VolatileExampleFixed {
private static volatile boolean isRunning = false; // ✅ Added volatile
public static void main(String[] args) {
new Thread(() -> {
System.out.println("Thread 1: Setting isRunning = true");
isRunning = true;
}).start();
new Thread(() -> {
while (!isRunning) {
// Now Thread 2 always sees the updated value
}
System.out.println("Thread 2: Exit loop (isRunning is now true!)");
}).start();
}
}
Why it works**:
- The volatile
keyword forces every read/write** of isRunning
to go directly to main memory** (not a thread’s local cache).
- Thread 2 always sees the latest value of isRunning
set by Thread 1.
-
volatile
does NOT make operations atomic**
java
private static volatile int count = 0;
count++; NOT thread-safe! (Read → Modify → Write is not atomic)
`
- Why?** count++
is three steps: read count
, increment, write back.
- Fix**: Use AtomicInteger
or synchronized
.
2. Use only for simple flags/booleans**
- ✅ Good: volatile boolean isReady;
- ❌ Bad: volatile int counter;
(use AtomicInteger
instead).
3. Does not replace synchronized
- volatile
solves visibility, but not mutual exclusion** (only one thread can enter a critical section).
- For complex state (e.g., Map
), use synchronized
or ConcurrentHashMap
.
-
volatile
| Scenario | Example | Why? |
|-----------------------------------|-----------------------------|-------------------------------|
| Simple flag to signal state change | volatile boolean isPaused;
| Threads must see the latest flag value |
| "One-time" initialization (double-check lock) | volatile Object instance;
| Prevents stale reads of a lazy-initialized object |
-
synchronized
" | ❌ synchronized
provides both visibility and atomicity |
-
volatile
ONLY when:**
> 1. You need visibility** of a single variable across threads,
> 2. The variable is simple** (e.g., boolean
, int
, reference),
> 3. You don’t need atomic operations** (e.g., count++
).
>
> Otherwise, use synchronized
, AtomicInteger
, or ConcurrentHashMap
.**
> 🌟 Pro Tip**: If you need to increment a counter safely, never** use > private static final AtomicInteger counter = new AtomicInteger(0);
> counter.incrementAndGet(); Thread-safe!
> volatile int
. Always use AtomicInteger
:
> java
`
Ама тва е на английски. Рабинката не одобрява.
Сега ще го питам да го преведе да видя как му е българския. Подозорам, че е доста зле и е русифициран.
акаунт
на
Единия
акаунт
на
Единия, видяно: 100 пъти.
Who cares Yugi!?
Кой използва български бе братко?
Българския съдържа турцизми и циганизми.
Аз ползвам само английски, немски и изобщо, доктор Радева... МИ Е ЗАБРАНИЛА ДА ГОВОРЯ НА БЪЛГАРСКИ!
Това са проверени неща, еничер бесен. На AtTiny, 10 реда код. Именно това прави, дето Ребата ми го обясни. Всичките прости глави се чесахме с колегите, не се сети никой. Компилатора беше WinAVR, не знам дали е C++ отдоле, на Ардуино е истински пълнокръвен С++ дето може да компилираш ААА игра на ньега. Бесни оптимизации и чудеса.
Подозирам, че ти си бил бай умния и опитен в екипа, нали?
Според мен всичките "авери" на козоеба са пишман експерти като него. Професионалния земеделец разбира от земеделие толкова, колкото козоеба от компютри. Професионалния автомонтьор разбира от коли колкото професионалния земеделец разбира от земеделие, и т.н. и т.н. :)
Макя ти обаче не може да се отърве от мангали. Била профи и не взема скъпо.
Миризливия козоеб пак се опитва да измести темата от абсолютната некадърност на аверите му и него самия. :)