Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi

0
Java Deadlock

Açık 1 Cevaplar 42 Gösterim Java
package com.training;

public class ConcurrencyProcess {

public static void main(String[] args) throws InterruptedException {

Account a1 = new Account(10000,"origin");

Account a2 = new Account(10000,"destination");

Thread t1 = new Thread( new TransferManager(a1,a2));

Thread t2 = new Thread( new TransferManager(a2,a1));

t1.start();

t2.start();

t1.join();

}

}

package com.training;

public final class Account {

private int balance = 0;

private String name;

public Account(int balance, String name) {

super();

this.balance = balance;

this.name = name;

}

public synchronized void add(Integer amount) {

this.balance = balance + amount;

}

public synchronized void sub(Integer amount) {

this.balance = balance - amount;

}

public synchronized int getBalance() {

return balance;

}

public synchronized void setBalance(int balance) {

this.balance = balance;

}

}

package com.training;

public class TransferManager implements Runnable {

private Account origin;

private Account destination;

public TransferManager(Account a1, Account a2) {

origin = a1;

destination = a2;

}

@Override

public void run() {

while (true) {

// synchronized (origin) {

// synchronized (destination) {

// origin.sub(1);

// destination.add(100);

// System.out.println(origin.getBalance() + " " + destination.getBalance());

// }

// }

origin.sub(1);

destination.add(1);

System.out.println(origin.getBalance() + " " + destination.getBalance());

}

}

}

Yukarda paylaştığım classlar ile bir deadlock oluşturmaya çalışıyorum. Account class'ına synchronized anahtar kelimesini eklediğimde oluşmuyor ancak TransferManager class'ı üzerinde comment li alanları açıp (Diğerlerini kapatın) çalıştırdığımda deadlock oluşuyor. Tamamen deneme amaçlı olduğu için neden böyle bir şey yapıyorsun demeyin :)

1 cevap

0

Aldım kodlarını eclipse içine attım denedim :)

Açıklama satırı olarak eklediğin kodları açtığım zaman deadlock oldu. Sıkıntı yok. Sanırım neden synchronized metodlarda olmuyor da synchronized bloğunun içinde olduğunu anlamak istiyorsun.

Uygulamanın çalışmasının grafiğini çıkarırsan güzel anlaşılabilir.

TransferManager sınıfındaki run metodunun çalışması aşağıdaki grafikte 1 ile 10 arası olsun.

3. zaman S1 yani synchronized bloklarından ilki. Origin değişkenini tutmuş durumdasın

4. zaman da S2 yani ikinci bloğun. Destination'u da tuttun.

Kırmızı gördüğün alanda iki değişken de tutulmuş durumda.

1 den 10 a kadar iki thread sürekli dönecekler. Bunda zaten hemfikirizdir, keza kodunda while(true) yani sonsuz döngü var.
İki thread birden kırmızı alana girmeye çalıştığını düşünelim. Birinci thread t1 ikincisi de t2 olsun.

t1 çalışırken s1 anına geldiğinde a1 accountunu tutar. t2 de s1 anına geldiğinde a2 accountunu tutar.
t1 s2 anına geldiği zaman a2 yi isteyecek t2 de s2 anında a1 i isteyecek. Al sana Meksika açmazı. Zaten burda kitlenip kalır.

Umarım anlatabilmişimdir.

(4k puan)
1Yorumlar
(134 puan)
Teşekkürler verdiğin cevap için. Çok yararlı bir bilgi oldu.