CComma's Blog

CComma's Blog

Connect the world

缓存行

内存数据放入高速缓存中时是以缓存行的形式放入的,多数情况把内存中连续的 64 字节的数据作为一个缓存行加入高速缓存,不会只单独放入几个字节的数据

伪共享问题: 位于同一缓存行的两个不同数据,被两个不同 CPU 锁定,产生互相影响的伪共享问题

缓存行对齐

1
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
33
34
35
36
37
38
39
public class CacheLinePadding {
// 加上 padding,使 arr[0] 和 arr[1] 在两个不同的缓存行中
// 使运行速度提升
private static class Padding {
public volatile long p1, p2, p3, p4, p5, p6, p7;
}

private static class T extends Padding {
public volatile long x = 0L;
}

public static T[] arr = new T[2];

static {
arr[0] = new T();
arr[1] = new T();
}

public static void main(String[] args) throws Exception {
Thread t1 = new Thread(() -> {
for (long i = 0; i < 10000_0000L; i++) {
arr[0].x = i;
}
});

Thread t2 = new Thread(() -> {
for (long i = 0; i < 10000_0000L; i++) {
arr[1].x = i;
}
});

final long start = System.nanoTime();
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println((System.nanoTime() - start) / 100_0000 + " ms");
}
}

缓存锁: MESI
【并发编程】MESI–CPU 缓存一致性协议

总线锁: 有些无法被缓存的数据或者跨越多个缓存行的数据还是得使用总线锁

Read more »

Java 从编码到执行

  • -Xmixed:混合模式
    • 使用解释器 + 热点代码编译
    • 起始阶段采用解释执行
    • 热点代码检测
      • 多次被调用的方法(使用 方法计数器 检测方法执行频率)
      • 多次被调用的循环(使用 循环计数器 检测循环执行频率)
      • 进行编译
  • -Xint:解释模式,启动快,执行慢
  • -Xcomp:编译模式,启动慢,执行快

Read more »

1. Master

线上

2. Develop

开发

3. Feature

Feature 分支做完后,必须合并回 Develop 分支
合并完分支后一般会删点这个 Feature 分支,但是也可以保留

4. Release

概述: 基于 Develop 分支创建,用于测试,修改 Bug
创建: 一旦创建了 Release 分支之后,不要再从 Develop 分支上合并新的改动到 Release 分支
发布: 发布 Release 分支时,合并 Release 到 Master 和 Develop, 同时在 Master 分支上打个 Tag 记住 Release 版本号,然后删除 Release 分支

5. Hotfix

基于 Master 分支创建,开发完后需要合并回 Master 和 Develop 分支,同时在 Master 上打一个 tag

若有收获,就点个赞吧

1. 配置用户名

git config --global user.name "username"

2. 配置邮箱

git config --global user.email "xxxx@xxxx.xx"

Read more »

1. 提交和拉取

1
2
3
4
5
6
7
8
# 暂存所有文件
git add .
# 暂存并提交
git commit -am
# push 到远程 git
git push
# 从远程 git 下拉到本地 git
git pull
Read more »

一、配置 MyBatis(XML 形式)

src/main/resources/mybatis-config.xml:

1
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
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--加载外部的properties文件,使用 ${jdbc.driver} 等形式注入-->
<properties resource="jdbc.properties"></properties>

<settings>
<setting name="logImpl" value="LOG4J" />
</settings>

<typeAliases>
<!--给单独的实体起别名-->
<!-- <typeAlias type="com.lagou.pojo.User" alias="user"></typeAlias>-->
<!--批量起别名:该包下所有的类的本身的类名:别名还不区分大小写-->
<package name="tk.mybatis.simple.model"/>
</typeAliases>

<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--<property name="driver" value="com.mysql.jdbc.Driver"/>-->
<!--<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>-->
<!--<property name="username" value="root"/>-->
<!--<property name="password" value=""/>-->
</dataSource>
</environment>
</environments>
<mappers>
<!-- <package name="tk.mybatis.simple.mapper"/> -->
<mapper resource="tk/mybatis/simple/mapper/CountryMapper.xml"/>
</mappers>
</configuration>
Read more »

一、事务管理器

概述:
Spring 提供了事务管理器的接口,具体实现由 ORM 框架提供

PlatformTransactionManager:事务管理器核⼼接⼝。提供标准

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public interface PlatformTransactionManager { 
/**
* 获取事务状态信息
*/
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException;

/**
* 提交事务
*/
void commit(TransactionStatus status) throws TransactionException;

/**
* 回滚事务
*/
void rollback(TransactionStatus status) throws TransactionException;
}
Read more »
0%