1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.util.internal;
17
18 import java.util.concurrent.atomic.AtomicBoolean;
19 import java.util.concurrent.atomic.AtomicLong;
20
21 import org.jboss.netty.logging.InternalLogger;
22 import org.jboss.netty.logging.InternalLoggerFactory;
23
24
25
26
27 public class SharedResourceMisuseDetector {
28
29 private static final int MAX_ACTIVE_INSTANCES = 256;
30 private static final InternalLogger logger =
31 InternalLoggerFactory.getInstance(SharedResourceMisuseDetector.class);
32
33 private final Class<?> type;
34 private final AtomicLong activeInstances = new AtomicLong();
35 private final AtomicBoolean logged = new AtomicBoolean();
36
37 public SharedResourceMisuseDetector(Class<?> type) {
38 if (type == null) {
39 throw new NullPointerException("type");
40 }
41 this.type = type;
42 }
43
44 public void increase() {
45 if (activeInstances.incrementAndGet() > MAX_ACTIVE_INSTANCES) {
46 if (logger.isWarnEnabled()) {
47 if (logged.compareAndSet(false, true)) {
48 logger.warn(
49 "You are creating too many " + type.getSimpleName() +
50 " instances. " + type.getSimpleName() +
51 " is a shared resource that must be reused across the" +
52 " application, so that only a few instances are created.");
53 }
54 }
55 }
56 }
57
58 public void decrease() {
59 activeInstances.decrementAndGet();
60 }
61 }