Ceviz Forum

Geri Dön   Ceviz Forum > Programlama > Java / JSP

Cevapla
 
LinkBack Seçenekler
Eski 23/04/2007, 22:23   #1 (permalink)
Üye
 
futi Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 07/2006
Mesaj: 80
Varsayılan synchronized kavramı nedir?

gecen threadlerle ilgili örneklere bakarken, ilk bir kaç örneği anladım sorun yoktu ( run(), sleep(); vb.. )

fakat synchronized olayını kavrayamadım?
nerde işe yarıyo nasıl, ne zaman kullanmalı, bunları açıklayan olursa sevinirim teşekkürler.
__________________
YTU Computer Engineering - ©2005
http://afsungur.blogspot.com
futi hatta değil   Alıntı Yaparak Yanıtla
Eski 24/04/2007, 02:02   #2 (permalink)
Eski Cevizci
 
myavuzselim Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 05/2004
Mesaj: 792
Varsayılan

Kod:
syncronized(nesne) {
    // kod
}
Bildigim kadariyla bir thread yukaridaki kodu calistirirken once nesneyi kilitler (yani "nesne benimdir, baskasi kullanamaz" der.). Eger nesne baskasi tarafindan zaten kilitlenmisse thread'imiz kilit acilana kadar beklemek zorundadir. Nesneye sahip olduktan sonra kod calisir. Kod sona erdikten sonra nesnenin kilidini kaldirir.

Programci bu yolla bir nesnenin ayni anda birden cok thread tarafindan kullanilmasini onlemeye calisir, cunku bu hatalara yok acabilir.

Ayrica:
Kod:
synchronized void birsey() {
    // kod
}
yine bildigim kadariyla sununla ayni seydir:
Kod:
void birsey() {
    synchronized(this) {
        // kod
    }
}
myavuzselim hatta değil   Alıntı Yaparak Yanıtla
Eski 24/04/2007, 20:34   #3 (permalink)
Eski Cevizci
 
Üyelik Tarihi: 06/2003
Mesaj: 131
Varsayılan

multi-thread bir uygulama yazıyor olalım.
klasik ornek; producer-consumer ornegi bu konuda.

producer ürettiği dataları bir pool'a koyar. Orneğimiz için pool bir ArrayList olsun. Consumer üretilen dataları bir şekilde tüketiyor olacak, tükettiğinide listeden silecek. Consumer ve Producer eş zamanlı çalışan iki thread'dir.

Burada consumer ve producer'in listeye eş zamanlı erişimini engellemek lazım. Yoksa senkronizasyon ile ilgili problemler yaşarsın. Listeden consumer işlemek için aldığı datayı silerken Producer data yazmaya çalışırsa (emin değilim ama) IndexOutOfBounds exception yersin(yada onun gibi bir exception).

Bu durumda(ve benzer durumlarda) yapılması gereken pool'a erişen her bir thread'in sıralı erişimini sağlamaktır. Bunu için genel yöntem pool'a erişim için bir helper class yazmak ve pool'a erişen metodları(veya blokları) synchronized anahtar kelimesi ile marklamaktır. Şöyleki;
<code>
public class PoolHelper {

private LinkedHashMap<String, Command> pool= new LinkedHashMap<String, Command>();

public synchronized void addCommand(Command command) {
pool.put( command.getCommandId(), command );
notifyAll(); //notify for new command
}

protected synchronized Command getLastCommand() {
if( pool.size()>0 ) {
for( Iterator i= pool.keySet().iterator(); i.hasNext(); ) {
String key= (String)i.next();
Command command= pool.get(key);
if( command.isInProcess() ) continue;
if( command.getResendDate()!=null && command.getResendDate().getTime()>System.currentTi meMillis() ) continue;
command.setInProcess( true );
return command;
}
}
try {
wait(1*1000); //wait for new command
}
catch (InterruptedException e) {
}
return null;
}
}

</code>

birde semafor/monitor/lock kavramları var
sen metodu synchronized olarak marklarsan bu o metod'un monitor olarak kullanılacağı anlamına gelir. Bütün metodları instance üzerinden senkronlamanın mantıklı olmadığı durumlarda(bazı metodların/blokların diğer tüm metod ve bloklama senkron olması performans açısından iyi olmayabilir), monitor değişkenleri kullanabilirsin. bunun için metod değil blok synchronized içine alınır. Synchronized blokların, synchronized metodlardan başka detay farklarıda var ama şimdilik boşver.

yukarıdaki ornekte göreceğin gibi wait ve notify/notifyAll yapıları var.
bunlarıda anlamaya çalış.

anlayamadığın yerleri bu başlık altında sorabilirsin.
dilimin dondüğü ve bildiğim kadarı ile yardımcı olmaya çalışırım.
Not: thread'in ne olduğunu anlaman multi-threading'i anlamaya başlamadan once mutlaka doğru olarak anlaman gereken bir şey.
Thread kabaca bir sınıf değil, bir execution order'dir.
Şu linkteki tutorial'i izlemeni oneririm:
http://java.sun.com/docs/books/tutor...rocthread.html

kolaylıklar...

Enson 24/04/2007 20:34 tarihinde karatoprak tarafından düzenlenmiştir.. Sebep: düzeltme
karatoprak hatta değil   Alıntı Yaparak Yanıtla
Eski 25/04/2007, 20:39   #4 (permalink)
Üye
 
futi Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 07/2006
Mesaj: 80
Varsayılan

teşekkürler....
__________________
YTU Computer Engineering - ©2005
http://afsungur.blogspot.com
futi hatta değil   Alıntı Yaparak Yanıtla
Cevapla

Bookmarks

Seçenekler

Mesaj Yazma Hakları
Yeni mesajgöndermezsiniz
Cevap yazamazsınız
Dosya ekleyemezsiniz
Mesajınızı düzenleyemezsiniz

BB code is Açık
[IMG] kodu Açık
HTML kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık

Benzer Konular
Konu Konuyu açana göre Forum Cevap En Son Mesaj
C# ta C++ taki dynamic cast kavramı? cskli C# 0 17/04/2007 13:05
ADSL de hız kavramı? suat2007_ Internet 11 30/03/2007 19:54
Programlamadaki "Handle" kavramı nedir? ozmeen Genel Programlama 1 01/03/2007 16:41
Nasıl yükseklik/derinlik kavramı verilebilir? Xone Flash / Director / Swift 3D ... 3 30/07/2006 19:56
sınıf nedir? obje nedir? bunların veritipi ile bağlantısı nedir? sckz C / C++ 46 30/07/2005 02:35


Forum saati Türkiye saatine göredir. GMT +3. Şu anda saat 00:29.

Reklamlar & Desteklenenler
Hassas Valf | Hassas Kaplama | Antalyamız | Gazete | Ticari Bilişim | Hakan Müştak | Rüya Tabirleri | Kadın | Hastalıklar | Cepte msn ve e-posta | Webmaster | Antalya Aupair | Turkish Property Antalya | Forum | Chat | Perde | Adsl | Araba | bolindir.com | guncelle.com | livescore | Web Tasarım | evden eve nakliyat | forum | evden eve | sohbet | Resimcim| Kalifiye İnsan Kaynakları | Web Tasarım | Oyun | Yusuf KOÇ | Akın Yorulmaz | şiir | UFO | Web Tasarım | Oyunlar | Canlı Tv |


Forum Yazılımı: vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright ©2001 - 2008, Ceviz.net