Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Sezioni critiche

  1. #1

    Sezioni critiche: aiuto

    ciao a tutti, stavo impazzendo su di un programma ...


    import java.util.*;

    class Pair { // Not thread-safe
    private int x, y;
    public Pair(int x, int y) {
    this.x = x;
    this.y = y;
    }
    public Pair() { this(0, 0); }
    public int getX() { return x; }
    public int getY() { return y; }
    public void incrementX() { x++; }
    public void incrementY() { y++; }
    public String toString() {
    return "x: " + x + ", y: " + y;
    }
    public class PairValuesNotEqualException
    extends RuntimeException {
    public PairValuesNotEqualException() {
    super("Pair values not equal: " + Pair.this);
    }
    }
    // Arbitrary invariant -- both variables must be equal:
    public void checkState() {
    if(x != y)
    throw new PairValuesNotEqualException();
    }
    }

    // Protect a Pair inside a thread-safe class:
    abstract class PairManager {
    protected Pair p = new Pair();
    private List storage = new ArrayList();
    public synchronized Pair getPair() {
    // Make a copy to keep the original safe:
    return new Pair(p.getX(), p.getY());
    }
    protected void store() { storage.add(getPair()); }
    // A "template method":
    public abstract void doTask();
    }

    // Synchronize the entire method:
    class PairManager1 extends PairManager {
    public synchronized void doTask() {
    p.incrementX();
    p.incrementY();
    store();
    }
    }

    // Use a critical section:
    class PairManager2 extends PairManager {
    public void doTask() {
    synchronized(this) {
    p.incrementX();
    p.incrementY();
    }
    store();
    }
    }

    class PairManipulator extends Thread {
    private PairManager pm;
    private int checkCounter = 0;
    private class PairChecker extends Thread {
    PairChecker() { start(); }
    public void run() {
    while(true) {
    checkCounter++;
    pm.getPair().checkState();
    }
    }
    }
    public PairManipulator(PairManager pm) {
    this.pm = pm;
    start();
    new PairChecker();
    }
    public void run() {
    while(true) {
    pm.doTask();
    }
    }
    public String toString() {
    return "Pair: " + pm.getPair() +
    " checkCounter = " + checkCounter;
    }
    }

    public class CriticalSection {
    public static void main(String[] args) {
    // Test the two different approaches:
    final PairManipulator
    pm1 = new PairManipulator(new PairManager1()),
    pm2 = new PairManipulator(new PairManager2());
    new Timer(true).schedule(new TimerTask() {
    public void run() {
    System.out.println("pm1: " + pm1);
    System.out.println("pm2: " + pm2);
    System.exit(0);
    }
    }, 500); // run() after 500 milliseconds
    }
    }

    Il libro dove ho trovato l'esempio afferma che nel metodo doTask() nella classe PairManager2 solo parte del metodo è reso synchronized poichè il metodo store() è protetto e quindi non è disponibile al client ma solo alle sottoclassi
    Ma io mi chiedo...se invece di un solo PairManipulator che accede al PairManager2 ne avessi + di uno...non potrebbe succedere che store() salva non i valori in p appena incrementati ma dei valori ulteriormente incrementati da un altro processo
    Purtroppo mi sono incartato nel dimostrarlo con un programma...voi che ne dite?

  2. #2
    Beh in effetti il tuo dubbio è legittimo se il metodo store venisse chiamato sia attraverso il metodo doTask che direttamente ma essendo chiamato solo dal metodo doTask che a sua volta puè essere chiamato da un solo processo per volta questo esclude la possibilità di doppie chiamate. Il codice è corretto così com'è.
    Il problema che dici tu si creerebbe se io scrivessi una classe diversa che crea un terzo processo che accede direttamenta al metodo store altrimenti non è possibile.

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  3. #3

  4. #4
    Di nulla!

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.