Merhaba. Java 1.4 öncesinde kullanılan ve halen kullanılmaya devam edilen synchronized ile Java 1.5 concurrent package içerisinde bulunan ReentrantLock kullanımı arasında ne fark var? Reentrant ne demek? Örnek verebilirseniz sevinirim.

soruldu: 06 Tem '12, 04:23

querman's gravatar image

querman
391162028
cevap kabul oranı: 0%

değiştirildi: 06 Tem '12, 04:23


Hemen hemen aynı denilebilir teknik olarak, ama ReEntrantLock için bir sürü avantaj söz konusu;

  1. Uzun süre bekleyen ve lock elde eden bloğa, diğer iş parçacıklarına adil olmak adına TimeOut tanımlanabilir. Synchronized da bu yok.
  2. Eğer bir blok için lock bir iş parçacığı tarafından elde edildi ise, bunu ReEntrant Lock da sorgulayabiliyorsun.
  3. Lock için bekletilen diğer iş parçacıklarının sayısını sorgulayabiliyorsun.
  4. Belirli bir süre Lock almak için bekleyen ama başaramayan iş parçacıklarının bundan vazgeçmesini sağlayabilirsin.
  5. Belirli bir şart için iş parçacığını bekletip , ardından uyararak devam etmesini sağlayabiliyorsun.

    Sizinle eğitim için hazırladığım örnekleri paylaşayım; Örnek1)

    public class KilitTest implements Runnable{

    static Lock kilit= new ReentrantLock();

    public static void main(String[] args) {
      for(int i=0;i<10;i++)
       new Thread(new KilitTest(),"Görev-"+i).start();
    
       }
    
    @Override
    public void run() {
    
        kilit.lock();
        System.out.println("Yetkiyi aldım : "+Thread.currentThread().getName());
        try
        {
            for(int i=0;i<10;i++)
            {
                System.out.println(i);
            }
    
        }
        finally {
            System.out.println("Kilidi bırakıyorum : "+Thread.currentThread().getName());
           kilit.unlock();
        }
    

    } }

    Örnek 2) public class KilitCondition{

    static Lock kilit= new ReentrantLock();
    static Condition sart=kilit.newCondition();
    public static void main(String[] args) throws InterruptedException {
        final KilitCondition condition=new KilitCondition();
    
         class Gorev implements Runnable{
    
            int id;
    
            Gorev(int id) {
                this.id = id;
            }
    
            @Override
            public void run() {
    
           condition.baslat(id);
    
            }
        };
    
      final  Thread t1= new Thread(new Gorev(0),"Görev-"+1);
        t1.setPriority(1);
        t1.start();
        Thread.sleep(2000);
        Thread t2=new Thread(new Gorev(1),"Görev-"+2);
        t2.setPriority(10);
        t2.start();
    
    }
    
    private void baslat(int id) {
    
            try {
                kilit.lock();
                for(int i=0;i<10;i++)
                {
                Thread.sleep(100);
    
                System.out.println(i);
                if (i==5 && id%2==0)
                {
                    System.out.println("Şart oluştu bekletiliyor..");
                    sart.await();
    
                }
                Thread.sleep(500);
    
                if (i==7 && id%2==1)
                {
                    System.out.println("Sinyal veriliyor..");
                    sart.signal();
                    sart.await();
    
                }
    
                    if(i==9 && id%2==0)
                    {
                      sart.signalAll();
                    }
    
                }
            }
    
            catch (InterruptedException e) {
                System.out.println("Şart oluştu bekleniyor..");
            }
            finally {
                kilit.unlock();
            }
        }
    }
    

Örnek 3)

public class KilitTest2 implements Runnable{

    static Lock kilit=new ReentrantLock();

    public static void main(String[] args) {
        for(int i=1;i<=10;i++)
            new Thread(new KilitTest2(),"Görev-"+i).start();
    }
    @Override
    public void run() {

       do{
        try {
            if(kilit.tryLock(500, TimeUnit.MILLISECONDS))
            {
                try{

                 System.out.println("Yetkiyi aldım : "+Thread.currentThread().getName());
                 for(int i=1;i<=10;i++)
                 {
                     System.out.println(i);
                     Thread.sleep(100);
                 }

                }

                catch (InterruptedException e) {
                    //
                }
                finally {
                System.out.println("Kilidi bırakıyorum : "+Thread.currentThread().getName());
                kilit.unlock();
                break;
            }
            }
             else {
                System.out.println("Kilidi alamadım üzgünüm :'( "+Thread.currentThread().getName());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

       }while (true);

    }
}

Örnek4) Yazmada farklı, okumada farklı muamele public class KilitTest3 {

    List<String> list=new ArrayList<>();
    static ReentrantReadWriteLock kilit= new ReentrantReadWriteLock();
    static Lock okuma=kilit.readLock();
    static Lock yazma=kilit.writeLock();

    public static void main(String[] args) {
        new KilitTest3().baslat();

    }

    private void baslat() {

        for(int i=0;i<5;i++)
        {
            new Thread(new YazmaGorevi(),"Yazma Görevi"+i).start();

        }
        for(int i=0;i<5;i++)
        {
            new Thread(new OkumaGorevi(),"Okuma Görevi"+i).start();

        }

    }

    private  class YazmaGorevi implements Runnable{

        @Override
        public void run() {
           try{                                                                                 
             yazma.lock();
               Thread.sleep(500);
               System.out.println("Yazma gerçekleşiyor.."+Thread.currentThread().getName());
             list.add(Thread.currentThread().getName()) ;

           } catch (InterruptedException e) {
               e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
           } finally {
               yazma.unlock();
           }
        }
    }

    private class OkumaGorevi implements Runnable{

        @Override
        public void run() {
            int rst= new Random().nextInt(5)+0;
            try{
                Thread.sleep(3000);
                okuma.lock();
                System.out.print("Okuma gerçekleşiyor..");
                System.out.println(list.get(rst));

            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } finally {
                okuma.unlock();
            }
        }
    }
}
permanent link

cevaplandı: 07 Tem '12, 01:24

UsTa's gravatar image

UsTa
2.0k925
cevap kabul oranı: 20%

değiştirildi: 07 Tem '12, 01:26

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,079
×31
×2

Soruldu: 06 Tem '12, 04:23

Görüntüleme: 1,626 kez

Son güncelleme: 07 Tem '12, 01:26

powered by BitNami OSQA