线程安全的单例模式
看别人的博客有感,结合公司的项目想了下,目前在公司项目里常用的线程安全单例模式是这么写的:
```
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
组播通信出现 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
解析 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
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
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