synchronized优化

This commit is contained in:
redkale
2023-02-01 19:17:32 +08:00
parent ad981835f9
commit 78f969d2cc
8 changed files with 68 additions and 55 deletions

View File

@@ -9,7 +9,7 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.net.*; import java.net.*;
import java.util.*; import java.util.*;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.*;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Stream; import java.util.stream.Stream;
@@ -250,8 +250,8 @@ public class NodeHttpServer extends NodeServer {
ss.add(new AbstractMap.SimpleEntry<>("HttpServlet (type=" + clazz.getName() + ")", mappings)); ss.add(new AbstractMap.SimpleEntry<>("HttpServlet (type=" + clazz.getName() + ")", mappings));
} }
} }
final List<AbstractMap.SimpleEntry<String, String[]>> rests = sb == null ? null : new ArrayList<>(); final CopyOnWriteArrayList<AbstractMap.SimpleEntry<String, String[]>> rests = sb == null ? null : new CopyOnWriteArrayList<>();
final List<AbstractMap.SimpleEntry<String, String[]>> webss = sb == null ? null : new ArrayList<>(); final CopyOnWriteArrayList<AbstractMap.SimpleEntry<String, String[]>> webss = sb == null ? null : new CopyOnWriteArrayList<>();
if (rest && serverConf != null) { if (rest && serverConf != null) {
final List<Object> restedObjects = new ArrayList<>(); final List<Object> restedObjects = new ArrayList<>();
final ReentrantLock restedLock = new ReentrantLock(); final ReentrantLock restedLock = new ReentrantLock();
@@ -343,8 +343,8 @@ public class NodeHttpServer extends NodeServer {
protected void loadRestServlet(final ClassFilter<? extends WebSocket> webSocketFilter, protected void loadRestServlet(final ClassFilter<? extends WebSocket> webSocketFilter,
final AnyValue restConf, final List<Object> restedObjects, final AnyValue restConf, final List<Object> restedObjects,
final ReentrantLock restedLock, final StringBuilder sb, final ReentrantLock restedLock, final StringBuilder sb,
final List<AbstractMap.SimpleEntry<String, String[]>> rests, final CopyOnWriteArrayList<AbstractMap.SimpleEntry<String, String[]>> rests,
final List<AbstractMap.SimpleEntry<String, String[]>> webss) throws Exception { final CopyOnWriteArrayList<AbstractMap.SimpleEntry<String, String[]>> webss) throws Exception {
if (!rest) { if (!rest) {
return; return;
} }
@@ -440,9 +440,7 @@ public class NodeHttpServer extends NodeServer {
for (int i = 0; i < mappings.length; i++) { for (int i = 0; i < mappings.length; i++) {
mappings[i] = prefix2 + mappings[i]; mappings[i] = prefix2 + mappings[i];
} }
synchronized (rests) { rests.add(new AbstractMap.SimpleEntry<>(Sncp.getResourceType(service).getName() + "#" + name, mappings));
rests.add(new AbstractMap.SimpleEntry<>(Sncp.getResourceType(service).getName() + "#" + name, mappings));
}
} }
} finally { } finally {
scdl.countDown(); scdl.countDown();
@@ -512,9 +510,7 @@ public class NodeHttpServer extends NodeServer {
for (int i = 0; i < mappings.length; i++) { for (int i = 0; i < mappings.length; i++) {
mappings[i] = prefix2 + mappings[i]; mappings[i] = prefix2 + mappings[i];
} }
synchronized (webss) { webss.add(new AbstractMap.SimpleEntry<>(stype.getName() + "#" + rs.name(), mappings));
webss.add(new AbstractMap.SimpleEntry<>(stype.getName() + "#" + rs.name(), mappings));
}
} }
} }
} }

View File

@@ -10,7 +10,7 @@ import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.AsynchronousSocketChannel;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.redkale.annotation.Comment; import java.util.concurrent.locks.ReentrantLock;
import org.redkale.annotation.*; import org.redkale.annotation.*;
import org.redkale.boot.Application; import org.redkale.boot.Application;
import org.redkale.net.*; import org.redkale.net.*;
@@ -36,6 +36,8 @@ public class TransportWatchService extends AbstractWatchService {
@Comment("Node节点IP地址已存在") @Comment("Node节点IP地址已存在")
public static final int RET_TRANSPORT_ADDR_EXISTS = 1606_0003; public static final int RET_TRANSPORT_ADDR_EXISTS = 1606_0003;
protected final ReentrantLock lock = new ReentrantLock();
@Resource @Resource
protected Application application; protected Application application;
@@ -63,7 +65,8 @@ public class TransportWatchService extends AbstractWatchService {
if (transportFactory.findGroupName(address) != null) { if (transportFactory.findGroupName(address) != null) {
return new RetResult(RET_TRANSPORT_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") is exists"); return new RetResult(RET_TRANSPORT_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") is exists");
} }
synchronized (this) { lock.lock();
try {
if (transportFactory.findGroupInfo(group) == null) { if (transportFactory.findGroupInfo(group) == null) {
return new RetResult(RET_TRANSPORT_GROUP_NOT_EXISTS, "not found group (" + group + ")"); return new RetResult(RET_TRANSPORT_GROUP_NOT_EXISTS, "not found group (" + group + ")");
} }
@@ -87,6 +90,8 @@ public class TransportWatchService extends AbstractWatchService {
} }
} }
//application.restoreConfig(); //application.restoreConfig();
} finally {
lock.unlock();
} }
return RetResult.success(); return RetResult.success();
} }
@@ -102,7 +107,8 @@ public class TransportWatchService extends AbstractWatchService {
if (!group.equals(transportFactory.findGroupName(address))) { if (!group.equals(transportFactory.findGroupName(address))) {
return new RetResult(RET_TRANSPORT_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") not belong to group(" + group + ")"); return new RetResult(RET_TRANSPORT_ADDR_ILLEGAL, "InetSocketAddress(addr=" + addr + ", port=" + port + ") not belong to group(" + group + ")");
} }
synchronized (this) { lock.lock();
try {
if (transportFactory.findGroupInfo(group) == null) { if (transportFactory.findGroupInfo(group) == null) {
return new RetResult(RET_TRANSPORT_GROUP_NOT_EXISTS, "not found group (" + group + ")"); return new RetResult(RET_TRANSPORT_GROUP_NOT_EXISTS, "not found group (" + group + ")");
} }
@@ -125,6 +131,8 @@ public class TransportWatchService extends AbstractWatchService {
} }
} }
//application.restoreConfig(); //application.restoreConfig();
} finally {
lock.unlock();
} }
return RetResult.success(); return RetResult.success();
} }

View File

@@ -12,7 +12,7 @@ import java.net.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.CompletionHandler; import java.nio.channels.CompletionHandler;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -835,25 +835,11 @@ public abstract class ConvertFactory<R extends Reader, W extends Writer> {
* @param excludeColumns 需要排除的字段名 * @param excludeColumns 需要排除的字段名
*/ */
public final void registerIgnoreAll(final Class type, String... excludeColumns) { public final void registerIgnoreAll(final Class type, String... excludeColumns) {
Set<String> set = ignoreAlls.get(type); ignoreAlls.computeIfAbsent(type, t -> new CopyOnWriteArraySet<>()).addAll(Arrays.asList(excludeColumns));
if (set == null) {
ignoreAlls.put(type, new HashSet<>(Arrays.asList(excludeColumns)));
} else {
synchronized (set) {
set.addAll(Arrays.asList(excludeColumns));
}
}
} }
public final void registerIgnoreAll(final Class type, Collection<String> excludeColumns) { public final void registerIgnoreAll(final Class type, Collection<String> excludeColumns) {
Set<String> set = ignoreAlls.get(type); ignoreAlls.computeIfAbsent(type, t -> new CopyOnWriteArraySet<>()).addAll(excludeColumns);
if (set == null) {
ignoreAlls.put(type, new HashSet<>(excludeColumns));
} else {
synchronized (set) {
set.addAll(new ArrayList(excludeColumns));
}
}
} }
public final void register(final Class type, boolean ignore, String... columns) { public final void register(final Class type, boolean ignore, String... columns) {

View File

@@ -8,6 +8,7 @@ package org.redkale.mq;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level; import java.util.logging.Level;
import org.redkale.convert.Convert; import org.redkale.convert.Convert;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
@@ -28,6 +29,8 @@ public abstract class MessageClient {
protected final ConcurrentHashMap<Long, MessageRespFutureNode> respNodes = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<Long, MessageRespFutureNode> respNodes = new ConcurrentHashMap<>();
private final ReentrantLock lock = new ReentrantLock();
protected final MessageAgent messageAgent; protected final MessageAgent messageAgent;
protected final AtomicLong msgSeqno; protected final AtomicLong msgSeqno;
@@ -58,7 +61,8 @@ public abstract class MessageClient {
boolean finest = messageAgent != null && messageAgent.logger.isLoggable(Level.FINEST); boolean finest = messageAgent != null && messageAgent.logger.isLoggable(Level.FINEST);
try { try {
if (this.respConsumer == null) { if (this.respConsumer == null) {
synchronized (this) { lock.lock();
try {
if (this.respConsumerid == null) { if (this.respConsumerid == null) {
this.respConsumerid = "consumer-" + this.respTopic; this.respConsumerid = "consumer-" + this.respTopic;
} }
@@ -100,6 +104,8 @@ public abstract class MessageClient {
} }
this.respConsumer = one; this.respConsumer = one;
} }
} finally {
lock.unlock();
} }
} }
if (needresp && (message.getRespTopic() == null || message.getRespTopic().isEmpty())) { if (needresp && (message.getRespTopic() == null || message.getRespTopic().isEmpty())) {

View File

@@ -28,16 +28,10 @@ public class MessageProducers {
} }
public MessageProducer getProducer(MessageRecord message) { public MessageProducer getProducer(MessageRecord message) {
if (this.producers.length == 1) return this.producers[0]; if (this.producers.length == 1) {
int hash = index.incrementAndGet(); return this.producers[0];
if (index.get() > 1000 * producers.length) {
synchronized (index) {
if (index.get() > 1000 * producers.length) {
index.addAndGet(-1000 * producers.length);
}
}
} }
return producers[hash % producers.length]; return producers[Math.abs(index.incrementAndGet()) % producers.length];
} }
public CompletableFuture<Void> apply(MessageRecord message) { public CompletableFuture<Void> apply(MessageRecord message) {

View File

@@ -13,6 +13,7 @@ import java.nio.channels.CompletionHandler;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
@@ -35,6 +36,8 @@ public final class Transport {
protected final AtomicInteger seq = new AtomicInteger(-1); protected final AtomicInteger seq = new AtomicInteger(-1);
protected final ReentrantLock lock = new ReentrantLock();
protected final TransportFactory factory; protected final TransportFactory factory;
protected final String name; //即<group>的name属性 protected final String name; //即<group>的name属性
@@ -88,7 +91,8 @@ public final class Transport {
public final InetSocketAddress[] updateRemoteAddresses(final Collection<InetSocketAddress> addresses) { public final InetSocketAddress[] updateRemoteAddresses(final Collection<InetSocketAddress> addresses) {
final TransportNode[] oldNodes = this.transportNodes; final TransportNode[] oldNodes = this.transportNodes;
synchronized (this) { lock.lock();
try {
boolean same = false; boolean same = false;
if (this.transportNodes != null && addresses != null && this.transportNodes.length == addresses.size()) { if (this.transportNodes != null && addresses != null && this.transportNodes.length == addresses.size()) {
same = true; same = true;
@@ -122,6 +126,8 @@ public final class Transport {
} }
this.transportNodes = list.toArray(new TransportNode[list.size()]); this.transportNodes = list.toArray(new TransportNode[list.size()]);
} }
} finally {
lock.unlock();
} }
InetSocketAddress[] rs = new InetSocketAddress[oldNodes.length]; InetSocketAddress[] rs = new InetSocketAddress[oldNodes.length];
for (int i = 0; i < rs.length; i++) { for (int i = 0; i < rs.length; i++) {
@@ -137,7 +143,8 @@ public final class Transport {
if (clientAddress != null && clientAddress.equals(addr)) { if (clientAddress != null && clientAddress.equals(addr)) {
return false; return false;
} }
synchronized (this) { lock.lock();
try {
if (this.transportNodes.length == 0) { if (this.transportNodes.length == 0) {
this.transportNodes = new TransportNode[]{new TransportNode(factory.poolMaxConns, addr)}; this.transportNodes = new TransportNode[]{new TransportNode(factory.poolMaxConns, addr)};
} else { } else {
@@ -149,6 +156,8 @@ public final class Transport {
this.transportNodes = Utility.append(transportNodes, new TransportNode(factory.poolMaxConns, addr)); this.transportNodes = Utility.append(transportNodes, new TransportNode(factory.poolMaxConns, addr));
} }
return true; return true;
} finally {
lock.unlock();
} }
} }
@@ -156,8 +165,11 @@ public final class Transport {
if (addr == null) { if (addr == null) {
return false; return false;
} }
synchronized (this) { lock.lock();
try {
this.transportNodes = Utility.remove(transportNodes, new TransportNode(factory.poolMaxConns, addr)); this.transportNodes = Utility.remove(transportNodes, new TransportNode(factory.poolMaxConns, addr));
} finally {
lock.unlock();
} }
return true; return true;
} }

View File

@@ -7,6 +7,7 @@ package org.redkale.net;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.*; import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import org.redkale.convert.json.JsonConvert; import org.redkale.convert.json.JsonConvert;
import org.redkale.util.Utility; import org.redkale.util.Utility;
@@ -20,6 +21,8 @@ import org.redkale.util.Utility;
*/ */
public class TransportGroupInfo { public class TransportGroupInfo {
protected final ReentrantLock lock = new ReentrantLock();
protected String name; //地址 protected String name; //地址
protected String protocol; //协议 取值范围: TCP、UDP protected String protocol; //协议 取值范围: TCP、UDP
@@ -78,11 +81,14 @@ public class TransportGroupInfo {
} }
public boolean containsAddress(InetSocketAddress addr) { public boolean containsAddress(InetSocketAddress addr) {
synchronized (this) { lock.lock();
try {
if (this.addresses == null) { if (this.addresses == null) {
return false; return false;
} }
return this.addresses.contains(addr); return this.addresses.contains(addr);
} finally {
lock.unlock();
} }
} }
@@ -90,11 +96,14 @@ public class TransportGroupInfo {
if (addr == null) { if (addr == null) {
return; return;
} }
synchronized (this) { lock.lock();
try {
if (this.addresses == null) { if (this.addresses == null) {
return; return;
} }
this.addresses.remove(addr); this.addresses.remove(addr);
} finally {
lock.unlock();
} }
} }
@@ -102,11 +111,14 @@ public class TransportGroupInfo {
if (addr == null) { if (addr == null) {
return; return;
} }
synchronized (this) { lock.lock();
try {
if (this.addresses == null) { if (this.addresses == null) {
this.addresses = new HashSet<>(); this.addresses = new HashSet<>();
} }
this.addresses.add(addr); this.addresses.add(addr);
} finally {
lock.unlock();
} }
} }
@@ -114,11 +126,14 @@ public class TransportGroupInfo {
if (addrs == null) { if (addrs == null) {
return; return;
} }
synchronized (this) { lock.lock();
try {
if (this.addresses == null) { if (this.addresses == null) {
this.addresses = new HashSet<>(); this.addresses = new HashSet<>();
} }
this.addresses.addAll(addrs); this.addresses.addAll(addrs);
} finally {
lock.unlock();
} }
} }

View File

@@ -15,7 +15,7 @@ import org.redkale.net.*;
* 详情见: https://redkale.org * 详情见: https://redkale.org
* *
* @author zhangjx * @author zhangjx
* *
* @since 2.7.0 * @since 2.7.0
*/ */
public class ClientAddress implements java.io.Serializable { public class ClientAddress implements java.io.Serializable {
@@ -66,12 +66,8 @@ public class ClientAddress implements java.io.Serializable {
if (addr == null) { if (addr == null) {
SocketAddress[] addrs = this.addresses; SocketAddress[] addrs = this.addresses;
if (addrs == null) { if (addrs == null) {
synchronized (this) { this.addresses = createAddressArray(this.weights);
if (this.addresses == null) { addrs = this.addresses;
this.addresses = createAddressArray(this.weights);
addrs = this.addresses;
}
}
} }
addr = addrs[ThreadLocalRandom.current().nextInt(addrs.length)]; addr = addrs[ThreadLocalRandom.current().nextInt(addrs.length)];
} }