Results 1 to 1 of 1
-
How to synchronize blocks instead of entire methods
This Java tip shows how to synchronize blocks instead of entire methods.
Java Code:import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; 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 } } ///:~ 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; } }
Similar Threads
-
How to synchronize threads on an object
By Java Tip in forum java.langReplies: 0Last Post: 04-09-2008, 06:39 PM -
Can't synchronize multiple JPanels in a JFrame
By vassil_zorev in forum AWT / SwingReplies: 0Last Post: 12-30-2007, 04:22 PM -
Blocks Language 0.1
By JavaBean in forum Java SoftwareReplies: 0Last Post: 09-22-2007, 11:21 PM -
Task Blocks 0.5
By johnt in forum Java SoftwareReplies: 0Last Post: 08-08-2007, 08:43 PM -
How to select/highlight an entire row in JTextArea
By Valeriano in forum AWT / SwingReplies: 2Last Post: 05-28-2007, 11:20 AM


LinkBack URL
About LinkBacks
Reply With Quote
Bookmarks