التزامن وتعدد الخيوط في Java: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التزامن وتعدد الخيوط في Java: من الأساسيات إلى التقنيات المتقدمة



تتطلب التطبيقات الحديثة أقصى أداء. في Java، يُعد التزامن وتعدد الخيوط أدوات أساسية للاستخدام الفعال للمعالجات متعددة النوى. في هذه المقالة، سنشرح كيفية العمل بشكل صحيح مع الخيوط، والمزامنة، والأدوات الحديثة للتزامن.



ما هو تعدد الخيوط في Java؟

تعدد الخيوط هو قدرة البرنامج على تنفيذ مهام متعددة في وقت واحد. في Java، كل خيط (thread) هو عملية خفيفة الوزن لها مكدس استدعاءات خاص بها. المزايا الرئيسية:

  • زيادة الأداء من خلال التنفيذ المتوازي
  • واجهة مستخدم أكثر استجابة
  • استخدام فعال لموارد وحدة المعالجة المركزية (CPU)


إنشاء الخيوط: طريقتان

في Java، هناك طريقتان رئيسيتان لإنشاء خيط:



1. الوراثة من الفئة Thread

public class MyThread extends Thread {    @Override    public void run() {        System.out.println("الخيط قيد التنفيذ: " + Thread.currentThread().getName());    }

public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); // بدء الخيط }}


2. تنفيذ الواجهة Runnable

public class Task implements Runnable {    @Override    public void run() {        System.out.println("المهمة تُنفذ في الخيط: " + Thread.currentThread().getName());    }

public static void main(String[] args) { Thread thread = new Thread(new Task()); thread.start(); }}

يُوصى باستخدام Runnable لأنه لا يحد من إمكانية وراثة الفئات الأخرى.



مزامنة الخيوط: تجنب حالة السباق (race condition)

عندما تصل عدة خيوط إلى بيانات مشتركة، تنشأ مشاكل في المزامنة. لننظر إلى مثال كلاسيكي — العداد:



public class Counter {    private int count = 0;

public synchronized void increment() { count++; }

public synchronized int getCount() { return count; }}

الكلمة المفتاحية synchronized تضمن أن خيطًا واحدًا فقط يمكنه تنفيذ الطريقة في نفس الوقت. البديل هو استخدام Lock من الحزمة java.util.concurrent.locks.



Deadlock: كيفية تجنب الحظر المتبادل

يحدث Deadlock عندما ينتظر خيطان تحرير موارد بعضهما البعض. مثال:

public class DeadlockExample {    private final Object lock1 = new Object();    private final Object lock2 = new Object();

public void method1() { synchronized (lock1) { synchronized (lock2) { // القسم الحرج } } }

public void method2() { synchronized (lock2) { synchronized (lock1) { // القسم الحرج } } }}

لتجنب deadlock، احرص دائمًا على الحصول على الأقفال بنفس الترتيب أو استخدم tryLock() مع مهلة زمنية.



ExecutorService: إدارة تجمع الخيوط

إنشاء الخيوط يدويًا غير فعال. توفر Java ExecutorService لإدارة تجمع الخيوط:



import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;

public class ThreadPoolExample { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(4);

for (int i = 0; i < 10; i++) { executor.submit(() -> { System.out.println("يُتنفذ في: " + Thread.currentThread().getName()); }); }

executor.shutdown(); // الإنهاء بعد تنفيذ جميع المهام }}

الرئيسية ت

المدونات

توصيات الكتب