ThreadLocal
ThreadLocal
两个优点:
当前线程与其他线程互不影响
在当前线程内全局共享
关于内存泄漏
动态的分配内存,由于某种原因而没有释放或者无法释放,导致内存浪费
ThreadLocal中有个ThreadLocalMap,而ThreadLocalMap中有Entry<String, String>,如果他是弱引用,那么他在GC回收时立即回收,这时key会被回收,但是null不会被回收,如果他是强引用,那么key和value都不会被回收,总之就是弱引用和强引用都会发生内存泄漏。
防止内存泄漏,在使用ThreadLocal后,使用remove()方法手动清楚所占空间
java中volatile
volatile
volatile是一个关键字,用于修饰变量,如private volatile boolean falg = false;,当一个变量用volatile修饰时,表示该变量是一个共享变量,它可以被多个线程访问。它的作用主要有两个方面
保证可见性
当在一个线程当中修改了用volatile关键字修饰的变量,那么它会立即同步到主内存当中,其他线程读取这个变量的值的时候,是直接读取内存中这个变量的值,而不是在当前线程中的缓存;同时也避免了多线程数据不一致的问题
禁止指令重排序
在没有使用volatile关键字的时候,JVM会进行指令重排序以优化执行效率,这样在使用多线程时会造成一些问题,使用了volatile关键字,就相当于告知了JVM不要对被修饰的变量进行指令重排序,比如:
有一个write()方法负责更改某个变量的值,read()方法用于读取某个变量的值,这时候有两个线程,第一个线程负责执行write()方法,第二个线程负责执行read()方法,如果此时JVM对指令进行重排序,有可能第二个线程先执行read()方法,这样就违背了预期的执行顺序
123456789 ...
sql表连接
sql中表连接
分为内连接和外连接和全连接,外连接又分为左外连接和右外连接,还有个交叉连接
内连接
join或者inner join,内连接返回两个表中匹配的行,只有当连接条件满足时,才会返回结果
1select * from table1 join table2 on table1.id = table2.id;
左外连接
left join,左外连接返回左表中的所有行,右表中符合连接条件的行,右表中不符合连接条件的行的值为NULL
1select * from table1 left join table2 on table1.id = table2.id
右外连接
right join,右外连接返回右表中的所有行,左表中符合连接条件的行,左表中不符合条件的行的值为NULL
1select * from table1 right join table2 on table1.id = table2.id
全连接
full join,全连接返回两个表中所有行,无论是否满足连接条件。某个表中没有匹配的行的值为NULL, 注意这个全连接mysql中不支持
...
redis数据持久化
Redis数据持久化
Redis是基于内存的NoSQL数据库,所以它的读写速度很快,但存储在内存中的Redis数据会在服务器重启后丢失。
在一些场景里需要长久地保存数据,所以需要把内存中的Redis数据持久化地保存在硬盘中。
Redis提供了两种持久化的方式,分别是AOF (Append Only File,只追加文件)和RDB (Redis DataBase,基于Redis数据库)
AOF持久化
在AOF持久化的过程中,会以日志的方式记录每个Redis “写”命令,并在Redis服务器重启时重新执行AOF日志文件中的命令,从而达到“恢复数据”的效果。
AOF持久化功能打开后,每当发生写的命令,该命令就会被记录到AOF缓冲区。
AOF缓冲区会根据事先配置的策略定期与硬盘文件进行同步操作。
当AOF文件大到一定程度后该文件会被重写,即在不影响持久化结果的前提下进行压缩。
当Redis服务器重启时,会加载硬盘上的AOF日志文件,以实现数据恢复的效果。
当Redis因发生故障而重启时,Redis服务器会按照如下步骤根据AOF日志文件恢复数据。
创建一个伪客户端(fake ...



