Дар бораи ҳолати рақобат (race condition) ва чӣ гуна бояд дар барномаҳои бисёрсоҳавӣ пешгирӣ кард, сӯҳбат кунед.
sobes.tech AI
Ҷавоб аз AI
Ҳолати гонка хатоест дар тарҳи системаи бисёрсӯзишворӣ, ки дар он натиҷаи иҷрои барнома аз тартиби иҷрои қисмҳои коди аз ҷониби сӯзишворҳои гуногун вобаста аст. Ин вақте рӯй медиҳад, ки чанд сӯзишвор ҳамзамон ба манбаи тағйирёбандаи умумӣ дастрасӣ доранд бидуни ҳамоҳангсозии мувофиқ.
Барои пешгирии ҳолати гонка дар Java, ба кор бурдани роҳҳои зерин истифода мешавад:
-
Истифодаи усулҳо ва блокҳои ҳамоҳангшуда:
class Counter { private int count = 0; // Усули ҳамоҳангшуда public synchronized void increment() { count++; } // Блоку ҳамоҳангшуда public void decrement() { synchronized (this) { count--; } } }Калиди
synchronizedкафолат медиҳад, ки танҳо як сӯзишвор ҳамзамон метавонад коди ҳамоҳангшударо барои ин объект иҷро кунад (ё барои синф, агар усул статикӣ бошад). -
Истифодаи синфи
Lockаз бастаjava.util.concurrent.locks:import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class SafeCounter { private int count = 0; private final Lock lock = new ReentrantLock(); public void increment() { lock.lock(); // Гирифтани баста try { count++; } finally { lock.unlock(); // озод кардани баста } } }Lockмеханизмҳои бештар флексиблро барои баста кардан дар муқоиса боsynchronizedпешниҳод мекунад. -
Истифодаи тағйирёбандаҳои атомӣ аз баста
java.util.concurrent.atomic:import java.util.concurrent.atomic.AtomicInteger; class AtomicCounter { private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); // амалияи атомӣ } }Тағйирёбандаҳои атомӣ амалҳои атомиро (масалан, зиёдкунӣ, камкунӣ) пешниҳод мекунанд, ки ҳамчун як воҳид иҷро мешаванд ва аз ҷониби сӯзишвории дигар қатъ намешаванд.
-
Истифодаи ҷамъиятҳои бехатари сӯзишворӣ аз баста
java.util.concurrent: Масалан,ConcurrentHashMap,CopyOnWriteArrayList. Ин ҷамъиятҳо барои истифодаи бехатари дар муҳити бисёрсӯзишворӣ таҳия шудаанд. -
Таҳаммул кардани ҳолати тағйирёбандаи умумӣ: Агар имконпазир бошад, маълумоте, ки ба чанд сӯзишвор дастрасӣ доранд, бояд бе тағйирот (immutable) ё барои ҳар як сӯзишвор ҷудо карда шаванд.
-
Истифодаи
volatile: Калидиvolatileкафолат медиҳад, ки тағйирот дар тағйирёбанда барои ҳама сӯзишворҳо намоён аст, аммо амалҳои атомиро (ғайр аз хондан ва навиштани намудҳои primitives, ба истиснои long ва double, ва истинодҳо) кафолат намедиҳад. Он дар якҷоягӣ бо дигар механизмҳо ё барои амалҳои оддӣ ва мустақил аз ҳолат муфид аст.class VolatileFlag { volatile boolean flag = false; // Намоёншавии тағйирот кафолат дода шудааст public void setFlag() { flag = true; } public boolean isFlag() { return flag; } }
Интихоби усули мувофиқ ба ҳолати мушаххас ва талаботҳои иҷроиш ва мураккабии код вобаста аст.