Multithreading va konkurentlik
Daraja: Ilg'or
Bir vaqtda bir nechta ishni bajarish uchun oqim (thread) ishlatiladi. Qo'lda `new Thread` o'rniga `ExecutorService` yoki `CompletableFuture` afzal. Umumiy o'zgaruvchiga bir nechta oqim tegsa — race condition; buni `synchronized`, atomik turlar yoki immutable obyektlar bilan hal qilinadi.
Tushuntirish
Bir vaqtda bir nechta ishni bajarish uchun oqim (thread) ishlatiladi. Qo'lda `new Thread` o'rniga `ExecutorService` yoki `CompletableFuture` afzal. Umumiy o'zgaruvchiga bir nechta oqim tegsa — race condition; buni `synchronized`, atomik turlar yoki immutable obyektlar bilan hal qilinadi.
Kod misoli
ExecutorService pool = Executors.newFixedThreadPool(4);
List<Future<String>> natijalar = new ArrayList<>();
for (String url : urls) {
natijalar.add(pool.submit(() -> yukla(url)));
}
for (Future<String> f : natijalar) System.out.println(f.get());
pool.shutdown();
// CompletableFuture bilan
CompletableFuture<String> cf = CompletableFuture
.supplyAsync(() -> yukla(url))
.thenApply(String::trim)
.exceptionally(e -> "xato: " + e.getMessage());
AtomicInteger hisob = new AtomicInteger(); // xavfsiz sanagich
Keng tarqalgan xatolar
- shutdown() chaqirmaslik — dastur tugamay osilib qoladi.
- Oddiy `int counter++` ni bir nechta oqimda ishlatish — natija noto'g'ri chiqadi.
Mashqlar
- 10 ta URL'ni ketma-ket va parallel yuklab, vaqtni solishtir.
- Race condition'ni ataylab yuzaga keltirib, keyin AtomicInteger bilan tuzat.
Teglar: thread, concurrency