线程安全的单例模式
看别人的博客有感,结合公司的项目想了下,目前在公司项目里常用的线程安全单例模式是这么写的: ``` public class Hxy{ private static Hxy hxy = new Hxy(); private Hxy(){ } public static Hxy getInstance(){ return hxy; } } ``` 没有使用同步锁,同样多线程安全,这看起来的话公司的这种写法在类加载的时候就会new一个对象出来,有大量的类是这么写的话,理论上这会使得在启动的时候变慢。 多线程安全单例的第二种写法,使用同步锁: ``` public class Hxy{ private static Hxy instance = new Hxy(); private Hxy(){ } public static synchronized Hxy getInstance(){ if(null == instance){ instance = new Hxy(); } return instance; } } ...

2019-01-24 15:02

类型:工作 标签:单例,线程安全,java

组播通信出现 SocketException 异常
组播通信出现`Can't assign requested address`的`SocketException`异常 报错信息如下: ``` java.net.SocketException: Can't assign requested address at java.net.PlainDatagramSocketImpl.join(Native Method) at java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.java:179) at java.net.MulticastSocket.joinGroup(MulticastSocket.java:323) at net.yuxianghe.Listener.main(Listener.java:21) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(N...

2019-01-24 15:00

类型:工作 标签:socket,组播,java

解析 el 表达式出错
部分功能页面没有进行前后端分离,使用的还是jsp技术。 容器本身是有包进行解析el的,如果在项目里引入了 `javax.el` 包会导致解析el表达式出错,具体报错如下: ``` 2019-01-23 13:32:35,134 ERROR [org.apache.catalina.core.ContainerBase] Servlet.service() for servlet jsp threw exception java.lang.LinkageError: javax/el/ExpressionFactory at org.apache.jsp.xxx ``` 在jsp中使用了类似于这种el表达式的时候就会出现上面的报错 `cxxxx.jsp` ``` <c:forEach var="act" items="${listAct}"> ``` jsp编译之后生产的java文件大致是在 ``` work/xxx/localhost/_/org/apache/jsp/xxx ``` 容器不一样目录也会有差异。 jsp编译成的java为 `cxxxx_jsp.java` ``...

2019-01-23 06:22

类型:工作 标签:el,jsp,java

log4j 迁移到 logback 的小插曲
这次把使用log4j的项目中的log4j都去掉了,统一使用logback。 就需要干掉下面下面两个jar包 ``` log4j.jar slf4j-log4j12.jar ``` 由于项目中代码很多地方直接使用了`log4j`,所以需要引入 `log4j-over-slf4j` > 这个包会和log4j冲突,必须全部排出掉log4j的包。 去掉log4j的配置文件,引入logback的包,加上logback的包和配置文件 ``` logback-classic logback-core slf4j-api log4j-over-slf4j ``` 有个很有意思的插曲,上线后发现了一个很诡异的事情,日志输出的时间和服务器的北京时间相差了8小时,配置格式: ``` <Pattern>%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%thread] %level - %m%n</Pattern> ``` 这个配置如果使用log4j的话输出格式大致是这样的: ``` 2019-01-20 23:00:00,621 INFO ...... ``` 如果放在logback的话,输出...

2019-01-22 07:33

类型:工作 标签:log4j,logback,java

JVM 调优后续(一)
GC调整为G1的实验机器因为`Ref Proc`的时间过长很难受,主要原因是年轻代空间很大,因为网络IO处理线程太多。 上文中可以看到: ``` 2018-12-20T20:59:19.983+0800: 92405.779: [GC pause (G1 Evacuation Pause) (young), 0.1240010 secs] [Parallel Time: 5.6 ms, GC Workers: 4] [GC Worker Start (ms): Min: 92405778.9, Avg: 92405779.0, Max: 92405779.0, Diff: 0.1] [Ext Root Scanning (ms): Min: 2.1, Avg: 2.2, Max: 2.5, Diff: 0.4, Sum: 8.9] [Update RS (ms): Min: 0.4, Avg: 0.5, Max: 0.6, Diff: 0.2, Sum: 2.1] [Processed Buffers: Min: 11, Avg: 22.2, ...

2018-12-28 06:07

类型:工作 标签:jvm,java,g1,gc

我与我周旋久 独孤影 开源实验室