Author: michiel
Date: 2010-05-03 11:39:48 +0200 (Mon, 03 May 2010)
New Revision: 42080

Modified:
   
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
Log:
it's better to only synchronize on final variables

Modified: 
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
===================================================================
--- 
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
     2010-05-03 09:06:58 UTC (rev 42079)
+++ 
mmbase/trunk/applications/crontab/src/main/java/org/mmbase/applications/crontab/CronDaemon.java
     2010-05-03 09:39:48 UTC (rev 42080)
@@ -30,12 +30,13 @@
     private static final Logger log = 
Logging.getLoggerInstance(CronDaemon.class);
 
     private static CronDaemon cronDaemon;
-    private Set<CronEntry> cronEntries;
-    private Set<CronEntry> removedCronEntries;
-    private Set<CronEntry> addedCronEntries;
+    private final Set<CronEntry> cronEntries        = 
Collections.synchronizedSet(new LinkedHashSet<CronEntry>()); // predictable 
order
+    private final Set<CronEntry> removedCronEntries = 
Collections.synchronizedSet(new HashSet<CronEntry>());
+    private final Set<CronEntry> addedCronEntries   = 
Collections.synchronizedSet(new LinkedHashSet<CronEntry>()); // predictable  
order
 
-    private DelayQueue<ProposedJobs.Event> proposedJobs = null;
+    private final DelayQueue<ProposedJobs.Event> proposedJobs = new 
DelayQueue<ProposedJobs.Event>();
 
+
     private ScheduledFuture proposedFuture;
     private ScheduledFuture failedFuture;
     private ScheduledFuture future;
@@ -45,9 +46,6 @@
      * CronDaemon is a Singleton. This makes the one instance and starts the 
Thread.
      */
     private CronDaemon() {
-        cronEntries = Collections.synchronizedSet(new 
LinkedHashSet<CronEntry>()); // predictable order
-        removedCronEntries = Collections.synchronizedSet(new 
HashSet<CronEntry>());
-        addedCronEntries = Collections.synchronizedSet(new 
LinkedHashSet<CronEntry>()); // predictable  order
         EventManager.getInstance().addEventListener(this);
         start();
     }
@@ -126,7 +124,6 @@
 
     protected void consumeJobs() {
         synchronized(proposedJobs) {
-
             for (ProposedJobs.Event event = proposedJobs.poll(); event != 
null; event = proposedJobs.poll()) {
                 if (event.isLocal()) {
                     log.service("Consuming " + event + " locally");
@@ -214,27 +211,28 @@
      */
     protected void addEntry(CronEntry entry) {
         entry.init();
-        if ((entry.getType() == CronEntry.Type.BALANCE || entry.getType() == 
CronEntry.Type.BALANCE_MUSTBEONE)
-             && proposedJobs == null) {
-            proposedJobs = new DelayQueue<ProposedJobs.Event>();
-            proposedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() {
-                @Override
-                public void run() {
-                    CronDaemon.this.consumeJobs();
-                }
-            }, getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
-            ThreadPools.identify(proposedFuture, "Crontab's poposed balanced 
job consumer");
+        synchronized(cronEntries) {
+            if ((entry.getType() == CronEntry.Type.BALANCE || entry.getType() 
== CronEntry.Type.BALANCE_MUSTBEONE)
+                && proposedFuture == null) {
+                proposedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() {
+                        @Override
+                        public void run() {
+                            CronDaemon.this.consumeJobs();
+                        }
+                    }, getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
+                ThreadPools.identify(proposedFuture, "Crontab's poposed 
balanced job consumer");
+            }
+            if (failedFuture == null) {
+                failedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() {
+                        @Override
+                        public void run() {
+                            CronDaemon.this.detectFailedJobs();
+                        }
+                    }, getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
+                ThreadPools.identify(failedFuture, "Crontab's failed job 
detector (unfinished)");
+            }
+            cronEntries.add(entry);
         }
-        if (failedFuture == null) {
-            failedFuture = ThreadPools.scheduler.scheduleAtFixedRate(new 
Runnable() {
-                @Override
-                public void run() {
-                    CronDaemon.this.detectFailedJobs();
-                }
-            }, getFirst(), 60 * 1000, TimeUnit.MILLISECONDS);
-            ThreadPools.identify(failedFuture, "Crontab's failed job detector 
(unfinished)");
-        }
-        cronEntries.add(entry);
         log.service("Added entry " + entry);
     }
 

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to