Şimdi Ara

Java da cok tuhaf bir durum. (senkronizasyonla ilgili)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
43
Cevap
0
Favori
878
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 123
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Java da synchronized methods adli konuda kendim bir deney yaparak cok ilginc birseyle karsilastim ve bu durumu aciklayamadim bana cok sacma geliyor.

    bu arada synchronized keywordunu ve synchronized metodlarin ne oldugunu biliyorum. yani cok kucuk ihtimalle belki bilmedigim birsey veya birseyler vardir ama sanmiyorum. herneyse asagida bu ilginc durumu anlatmaya calisayim.

    join(long millis)
    adli synchronized fonksiyonu bilirsiniz.




    package work6;


    class Melgra extends Thread {

    @Override
    public void run() {
    try {
    System.out.println("Melgra type thread has started.");
    sleep(10000);
    System.out.println("Melgra type thread has ended.");
    } catch(Exception e) {}
    }

    public synchronized void moka() {

    try {
    sleep(3000);
    } catch (Exception e) {}

    }

    }


    class Sona extends Thread {

    String name;
    int testNo;
    Melgra thread;

    Sona(Melgra thr, String nm, int no) {
    thread = thr;
    name = nm;
    testNo = no;
    }

    public void test1() {
    try {
    System.out.println("Sona " + name + " Thread has started.");
    thread.join(3000);
    System.out.println("Sona " + name + " Thread has ended.");
    } catch (Exception e) {}
    }

    public void test2() {
    try {
    System.out.println("Sona " + name + " Thread has started.");
    thread.moka();
    System.out.println("Sona " + name + " Thread has ended.");
    } catch (Exception e) {}
    }


    @Override
    public void run() {

    if (testNo == 1) {test1();}
    else if (testNo == 2) {test2();}
    }

    }



    public class Main {

    public static void main(String[] args) {
    // test1();
    // test2();
    }

    public static void test1() {

    Melgra mg1 = new Melgra();

    Sona sn1 = new Sona(mg1, "sn1", 1);
    Sona sn2 = new Sona(mg1, "sn2", 1);

    mg1.start();
    sn1.start();
    sn2.start();
    }


    public static void test2() {

    Melgra mg1 = new Melgra();

    Sona sn1 = new Sona(mg1, "sn1", 2);
    Sona sn2 = new Sona(mg1, "sn2", 2);

    sn1.start();
    sn2.start();
    }

    }




    simdi buradaki tuhaf olay su: ben Main sinifinda test2 adli fonksyionu calistirdigimda sn1 ve sn2 threadleri 3 saniye araliklarla sonlaniyor bu gayet normal cunki moka adli fonksiyon synchronized oldugu icin 2. baslayan thread ilk baslaynin moka fonksyionunu calistirip bitirmesini bekliyor yani bi nevi ilk baslayan threadin bitmesini bekliyor. sonra 2. thread moka fonksyionunu calistiriyor ve 3 sn sonra oda sonlaniyor. yani ilk baslayan bittiken 3 sn sonra 2. baslayanda sonlaniyor. yani gayet beklendigi gibi.

    simdi gelelim Main sinifinin test1 adli fonksiyona bu fonksyionu calistirdigimda ise iki thread (sn1 ve sn2) ayni anda baslayip ayni anda sonlaniyor. oysa `join(long millis)` adli fonksyion synchronized oldugu icin burada beklenen ayni test1 fonksiyonunda oldugu gibi iki threadinde 3 sn araliklarla sonlanmasi gerekiyor ama ayni anda sonlanyor. yani buradaki join(long millis) fonksiyonu tipki synchronized deilmis gibi davraniyor. cunki 2. joinin 1. joini beklemesi gerekiyordu. neden boyle bir anormal durum veya normal ama benim anormal sandigim ve nedenini bilmedigim bir durum olusuyor ?

    umarim olayi anlatabilmisimdir. tesekkurler.

    < Bu ileti DH mobil uygulamasından atıldı >







  • Anlamıyorum ama uplayalım. İlgim var ama karışık geliyor

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Forum1th kullanıcısına yanıt
    anlamadıgınız kısım nedır soyleyın ona gore edıtleyeyım.

    < Bu ileti DH mobil uygulamasından atıldı >
  • thread.join() yazdığın yerde thread.run() çalışmıyor ki. Çalışmadığı için de 3 saniye beklemeden hemen dönüyor.


    Düzenleme: Yanlış görmüşüm start() ile başlatmışsın.



    < Bu mesaj bu kişi tarafından değiştirildi Guest-BF8E9B238 -- 5 Mart 2018; 20:4:52 >
    < Bu ileti DH mobil uygulamasından atıldı >
  • Sorun şu ki join() diğer thread leri bloklamaz.

    < Bu ileti DH mobil uygulamasından atıldı >
  • hocam java da run fonksiyonu Thread.start() komutu ile baslar yani sn1.start() ve sn2.start() ve mg1.start() ile run fonksyionlarini calistirmis oluyorum. start fonksyionu calistiriyor run fonksiyonunu.

    < Bu ileti DH mobil uygulamasından atıldı >
  • anlamadim. benim bildigim join fonksiyonu bir threadin bitmesini veya belirli sure icinde bitmesini bekler bu sure zarfi boyunca threadi dondurur. yani thread join satirinin oldugu yerde kalir.



    < Bu mesaj bu kişi tarafından değiştirildi psikolojikSorunlu.insan -- 5 Mart 2018; 20:16:30 >
    < Bu ileti DH mobil uygulamasından atıldı >
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • public void test1() {
    try {
    System.out.println("Sona " + name + " Thread has started.");
    thread.join(3000);
    System.out.println("Sona " + name + " Thread has ended.");
    } catch (Exception e) {}
    }


    Burada senkronize olan bişey yok. sn1 başlayınca sn2 de başlıyor ve ikisi de aynı anda bitiyor. Olması gereken bu.

    < Bu ileti DH mobil uygulamasından atıldı >
  • `public final synchronized void join(long millis)` bu kullandigim fonksiyonun imzasi yani bir sycnchronized fonksiyon. tipki Melgra.moka fonksiyonu gibi. burada senkronizasyan olmasi gerekmiyormu ? ozaman neden Melgra.moka fonksiyonunu cagirinca senkronizasyon oluyor ? sonucta ikiside synchronized fonksiyon.

    yani bence sn2 nin sn1 den 3 sn sonra bitmesi gerekir. cunki 1.thread (mg1 threadi) 10 sn sonra bitiyor en gec biteni yani.



    < Bu mesaj bu kişi tarafından değiştirildi psikolojikSorunlu.insan -- 5 Mart 2018; 20:30:56 >
    < Bu ileti DH mobil uygulamasından atıldı >
  • Javadan pek anlamam ama burada synchronized yazmıyor.

    https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join-long-

    < Bu ileti DH mobil uygulamasından atıldı >
  • synchronized olsa bile farketmez, yine aynı anda başlayıp aynı anda biterler. Sırayla çalışmaları için test1 isimli metodu komple sync içine alman gerekli.

    < Bu ileti DH mobil uygulamasından atıldı >
  • aaa. simdi yine baktim eclipseden hatta open declaration diyip fonksiyonun kendisine baktim yine benim dedigim gibi. bu arada benim kullandigim java nin surumu 9 sizin verdiginiz linkte java 8 anlatiliyor. cok ilginc java 9 da neden deismiski bu.

    < Bu ileti DH mobil uygulamasından atıldı >
  • ama synchronized metodlar sirayla calisir benimde solemek istedigim bu. neden moka fonksiyonunu cagirinca sirasi ile calisiyor ama yine synchronized bir fonksiyon olan join fonksiyonunu cagirinca sirasi ile calismiyor ?

    < Bu ileti DH mobil uygulamasından atıldı >
  • moka isimli metod synchronized, yani bir thread in o metoda girmesi için diğerinin çıkması gerekiyor.

    test1 ise sync değil. Olay sıralaması şu şekilde.

    sn1.start() ile bir thread başlar ve start() metodu biter
    sn2.start() ile bir başka thread başlar ve start() metodu biter

    Bu iki thread den hangisinin önce başlayacağı belli olmaz çünkü çok kısa zaman aralığı ile başlıyorlar.

    İkisi de test1 metoduna girer ve thread.join() de suspend durumuna geçerler. 3 saniye sonra kaldıkları yerden devam ederler ve aynı anda metoddan çıkarlar.


    Bir önceki mesajımda hatalı mantık yürütmüşüm. Evet join() metodu synchronized olursa aynı anda girerler fakat birisi 3 saniye sonra çıkardı. Aynı anda çıktıklarına göre demek ki join() synchronized değil. Zaten olması da saçma olurdu çünkü bunun için bir sebep yok.

    < Bu ileti DH mobil uygulamasından atıldı >
  • hocam olayi anlamissiniz bende bunu diyorum. eclipse synchronized diye gosteriyor bende diyorumki boyle olamaz sizde benimn dedigim gibi olamaz diyorsunuz hic java 9 un resmi sitesindeki metod imzasina bakmadim birde oraya bakayim. bakalim orada da eclipse nin dedigi gibi deil mi. yoksa bizim bilmedigimiz birseymi var.

    Edit:
    Muhtemelen bizim bilmedigimiz cok spesifik bir durum var.

    Edit2:
    intellij idea dan da baktim oda synchronized diyor. anlasilan synchronized.

    metod tanimi
    Java da cok tuhaf bir durum. (senkronizasyonla ilgili)



    < Bu mesaj bu kişi tarafından değiştirildi psikolojikSorunlu.insan -- 5 Mart 2018; 21:34:22 >
    < Bu ileti DH mobil uygulamasından atıldı >




  • https://docs.oracle.com/javase/9/docs/api/java/lang/Thread.html#join-long-

    İşte java 9, join sync değil. Bilmediğimiz bişey yok. join()'in sync olması hatalı olurdu zaten.

    Misal yazdığın gibi bir thread 10 saniyelik bir işlem yapıyor ve diğer 2 thread onu bitmesini bekliyor diyelim. Sync olsaydı önce birisi 2. saniyede girip 5. saniyede çıkar, sonra diğeri 5. saniyede girip 8. saniyede çıkardı. Sen thread'e 3 saniye beklemesini söylüyorsun ama çalışması bloke edildiği için 6 saniye beklemek zorunda kalıyor.

    Doğru olan ikisinin de 3 saniye bekleyip devam etmesidir.

    < Bu ileti DH mobil uygulamasından atıldı >




  • tesekkur ederim konu sonunda netlige kavustu. fakat simdi de ayri bir sorun cikti ben bu eclipse ve intellij idea ya nasil guvenecegim ? resmen benim kafami bukadar karistirip bukadar supheye soktular ve bir okadarda zamanimi bosa harcadilar inanamiyorum hala synchronized diye gosteriyor ikiside. bu sorunu nasil cozebilirim biliyormsunuz ? yukaridaki verdigim resme baskmissinizdir umarim.

    < Bu ileti DH mobil uygulamasından atıldı >
  • Resim büyümüyor ama anladım. Muhtemelen aynı kaynaktan otomatik tamamlama yapıyorlar. Nasıl düzeltileceği hakkında bir fikrim yok maalesef.

    Javada kütüphaneler tamamen binary olduğundan kod tamamlama için ayrı bir kaynak gerekiyor sanırım. C/C++ editörleri text formatındaki başlık dosyalarını okuyarak kodu tamamlıyor, böylece hata ihtimali kalmıyor.

    < Bu ileti DH mobil uygulamasından atıldı >
  • tekrardan tesekkur ederim yardiminiz icin. bu sorunu bi arastirayim.

    < Bu ileti DH mobil uygulamasından atıldı >
  • Selam,

    Soru güzel. İtiraf edeyim başta anlamadım ne sorduğunu, sonra dikkat edince fark ettim: evet, join() metodu synchronized ve normalde o sekilde calismamasi gerekiyor. Cevap join() metodunun icinde: wait() kullaniyor. Object.wait() sayfasindan ilgili kisim wait() method causes the current thread to relinquish any and all synchronization claims on this object.

    Bunlar ileri konular. Java'da gercekten herseyi yalayip yuttun da thread'ler mi kaldi geriye? Eger ciddiysen bu konuda su kitabi mutlaka okumalisin, deneme yanilma ile olmaz bu isler Java Concurrency in Practice, Brian Goetz et. al

    < Bu ileti mini sürüm kullanılarak atıldı >
  • 
Sayfa: 123
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.