大端存储和小端存储的区别
前言首先要记住:读数据永远是从低地址开始的!!! 什么是低地址、高地址?地址编号小的是低地址,地址编号大的是高地址 什么是数据的低位、高位?权值低的位是低位,权重高的位是高位 小端模式数据的低位放在低地址空间,数据的高位放在高地址空间 简记:小端就是低位对应低地址,高位对应高地址 存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101 从地址0到地址3分别是:0001-0101 1000-1100 1111-0110 1011-0100 读取数据:永远从低地址开始读,从低位放起,因此是这个方向存放:<- 得到 1011-0100-1111-0110-1000-1100-0001-0101 大端模式数据的高位放在低地址空间,数据的低位放在高地址空间 存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101 从地址0到地址3分别是:1011-0100 1111-0110 1000-1100 ...
深入理解synchronzied以及底层源码剖析
synchronized 保证三大特性 保证原子性:保证只有一个线程可以拿到锁,进入同步代码块 保证可见性:执行时会定义lock原子操作,会刷新工作内存共享变量的值 保证有序性:加synchronized后,依然会发生重排序,只不过因为加了同步代码块,可以保证只有一个线程执行同步代码块中的代码 synchronizd 的特性可重入特性什么是可重入? 一个线程可以多次执行synchronized,重复获取同一把锁 可重入性原理: synchronized的锁对象有一个计数器(recurisons变量)会记录线程获得几次锁,当计数器为0时,就释放锁 好处: 避免死锁 可以让我们更好的封装代码 不可中断特性一个线程获得锁后,另一个线程也要获得锁,那么这个线程处于阻塞或等待状态,如果第一个线程不释放锁第二个线程将会一直阻塞或等待(不可中断) 与此对比,lock可以调用lock方法(不可中断)和trylock方法(可中断) synchronized...
MySQL日志
MySQL三大日志是什么 undo log是Innodb存储引擎生成的日志,实现了事务的原子性,主要用于事务回滚和MVCC。在事务没提交之前,在事务没提交之前,Innodb会将更新前的记录记录在undo log中,需要回滚的时候根据undo log做原先相反操作 redo log也是Innodb存储引擎的日志,属于物理日志,记录了某个数据页做了什么修改,实现了事务的持久性,主要用于断电等故障恢复。比如某个事务提交了,脏页数据还没刷盘,但是断电了。下次重启的时候可以通过redo...
MySQL锁
MySQL锁全局锁: 通过flush talbe with read lock语句可以将整个数据库变成只读状态,这时候线程执行增删改或者表结构被修改都会阻塞,适用于全库备份逻辑。这样在备份数据库期间,不会因为表结构和数据的更新,使得备份文件的数据和预期不一样 表级锁: 表锁: 通过lock tables语句对表加表锁,表锁除了会限制其他线程的读写,还会限制本线程的读写 元数据锁:当我们对数据库表做操作,会自动给这个表加上MDL,对一张表做CRUD操作时,加的是MDL读锁;对一张表做结构更改时,加的是MDL写锁。这样对一张表执行CRUD操作时,防止其他线程对表做结构变更 意向锁:当执行插入、更新、删除操作时,需要先对表加上意向独占锁,然后对该记录加上独占锁。意向锁的目的是快速判断表里是否有记录被加锁 行级锁(只有InnoDB引擎有行级锁): 记录锁(Recode Lock):锁住的是一条记录。而且记录锁有S锁和X锁之分,满足读写互斥、写写互斥 间隙锁(Gap...
SpringBoot核心注解以及自动装配
核心注解 @SpringBootApplication:...
volatile原理
volatile可以解决可见性和有序性问题 volatile不能保证原子性问题 vloatile可以保证可见性 volatile可以防止指令重排序操作 为什么volatile不能保证原子性比如一个变量i被volatile修饰,两个线程都对这个变量进行修改,都对其进行i++操作,i++可以分为三步:先获取到变量i的值,其次对i的值+1,最后将新值写到缓存中。线程A首先得到变量i的值100,还没来得及修改就阻塞了,这时线程B也得到了i,并且做完了i++,然后写回到主内存。由于volatile主内存这时候的值是101。但是线程A已经读到了i的值100,也就是说这个原子操作已经结束了,所以这个可见性来的有点晚,所以线程A做完操作后刷新到主内存,i的值在主内存还是10 volatile内存可见性实现原理volatile 内存可见性主要通过 lock 前缀指令实现的,它会锁定当前内存区域的缓存(缓存行),并且立即将当前缓存行数据写入主内存(耗时非常短),回写主内存的时候会通过 MESI...
Java线程安全问题
Java线程安全性问题 原子性:一个或多个线程操作 CPU 执行的过程中被中断,互斥性称为操作的原子性 可见性:一个线程对共享变量的修改,其他线程不能立刻看到。要保证一个线程对主内存的修改可以及时的被其他线程观察到 有序性:程序执行的顺序没有按照代码的先后顺序执行 原子性安全JDK 里面提供了很多 atomic 类,比如 AtomicInteger、AtomicLong、AtomicBoolean 等等,这些类本身可以通过 CAS 来保证操作的原子性。另外 Java 也提供了各种锁机制,来保证锁内的代码块在同一时刻只能有一个线程执行,比如使用 synchronized 加锁,保证一个线程在对资源进行读、写时,其他线程不可对此资源进行操作,从而保证了线程的安全性 可见性安全同样可以通过 synchronized 关键字加锁来解决,与此同时,java 还提供了 volatile 关键字,要优于 synchronized 的性能,同样可以保证修改对其他线程的可见性。volatile...
MySQL事务
MySQL事务的特性MySQL事务有四大特性 ACID: 原子性、一致性、隔离性、持久性 原子性:一个事务中的操作要么全部完成,要么全部不完成,由undo log日志保证 一致性:事务完成后,数据库的状态必须保持一致。通过持久性+原子性+隔离性来保证 隔离性:一个事务不能被另外一个事务干扰,可以防止多个事务并发读写同一个数据库,导致数据不一致的情况发生,由MVCC和锁保证。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账 持久性:事务完成后对数据库的修改是永久的,不会因为系统故障而丢失,由redo log日志保证 MySQL事务隔离有哪些,解决了什么问题四个事务隔离级别: 读未提交:一个事务还没提交时,它做的变更可以被其他事务看到 读提交:一个事务提交后,它做的变更才可以被其他事务看到 可重复读:一个事务执行过程看到的数据,一直跟这个事务启动时看到的数据是一样的,也是MySQL...