Java基础
Automic
是一个原子类型包,其中包含了AtomicBoolean,AtomicInteger,AtomicLong等, 原子操作说是这样说的,然而并不是所有的物理机器都支持原子指令,所以不能保证不被阻塞,一般而言,采用的CAS+volatile+native的方法,避免synchronized的使用,如果不支持CAS那就上自旋锁了
接口



log4j
Maven依赖
1 | <dependency> |
log4j.properties
1 | log4j.rootLogger=all, stdout, logfile |
用法
1 | package com.wsx; |
SLF4J
log的实现太多了,log4j,logBack,jdklog,以后想换怎么办呢? Simple Logging Facade for Java 就像和JDBC一样,SLF4J把所有的日志框架连接起来
五个级别
trace,debug,info,warn,error 啥事不干,写下面的代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package com.wsx;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
public class Test {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(Test.class);
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
}1
2
3
422:23:01.931 [main] DEBUG com.wsx.Slf4jStudy - debug
22:23:01.940 [main] INFO com.wsx.Slf4jStudy - info
22:23:01.941 [main] WARN com.wsx.Slf4jStudy - warn
22:23:01.941 [main] ERROR com.wsx.Slf4jStudy - error1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32<configuration>
<!--
1.起别名
2.服务器上跑的项目多的时候可以好的区分
-->
<contextName>play_dice</contextName>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 调整输出的格式 -->
<encoder>
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<!--
1.key:对应的是动态的文件名
2.datePattern:是动态生成的时间格式
-->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- 动态设置日志的文件名 -->
<!--<file>D:\日志\log-${bySecond}.txt</file>-->
<append>false</append><!-- 每次一更新就是新的 -->
<encoder>
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<!-- 设置输出的等级 -->
<root level="tarce">
<appender-ref ref="STDOUT"/><!-- 输出到控制台 -->
<appender-ref ref="FILE"/><!-- 输出到文件中 -->
</root>
</configuration>1
%s/\v\<!--(.|\n){-}--\>//g
1 | <configuration> |
细节
1 | logger.info("hello {} {} {}","I","am","wsx"); |