youyichannel

志于道,据于德,依于仁,游于艺!

0%

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第五章

一、不同类型的页简介

InnoDB为了不同的目的而设计了许多种不同类型的,比如存放表空间头部信息的页,存放Insert Buffer信息的页,存放INODE信息的页,存放undo日志信息的页等等。

阅读全文 »

synchronized锁升级 —— 偏向锁

从 JDK 15 开始,这一特性被官方标记为废弃状态,如果还想继续使用的话需要通过 JVM 参数手动启用。

参考:https://zhuanlan.zhihu.com/p/365454004

偏向锁使用的前提:

  1. JDK1.6版本之后且开启了偏向锁配置。偏向锁在JDK6和JDK7中是默认开启的,但是它在应用程序启动几秒后才会激活,如有必要可以使用JVM参数-XX:BiasedLockingStartupDelay=0来关闭延迟。如果确定应用程序里所有的锁通常情况下处于竞争状态,可以通过JVM参数-XX:UseBiasedLocking=false关闭偏向锁,那么程序默认会进入轻量级锁状态。
  2. 被加锁的对象没有真正或者隐式调用父类Object#hashcode()方法
阅读全文 »

Synchronized的使用方式

Synchronized作用于普通方法、静态方法、同步代码块。通过javap -v命令深入查看。

阅读全文 »

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第四章

一、前言

到现在为止,MySQL对于我们来说还是一个黑盒,我们只负责使用客户端发送请求并等待服务器返回结果,表中的数据到底存到了哪里?以什么格式存放的?MySQL是以什么方式来访问的这些数据?

前面提到过,MySQL服务器程序上负责对表中数据进行读取和写入的部分是存储引擎,而服务器又支持不同类型的存储引擎,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,真实数据在不同存储引擎中存放的格式一般是不同的

由于InnoDB是MySQL中默认的存储引擎,也是最常用的存储引擎,因此以它为核心来看看数据的存储结构。

阅读全文 »

线程间通讯方式

线程之间互不干扰,各个线程具有自己的线程栈,存储线程自身的信息。为了使得线程之间实现通信,提供了如下的方式:

1)volatilesynchronizedlock => 保证数据的可见性

阅读全文 »

Thread#join

/**
* Waits at most {@code millis} milliseconds for this thread to
* die. A timeout of {@code 0} means to wait forever.
*
* <p> This implementation uses a loop of {@code this.wait} calls
* conditioned on {@code this.isAlive}. As a thread terminates the
* {@code this.notifyAll} method is invoked. It is recommended that
* applications not use {@code wait}, {@code notify}, or
* {@code notifyAll} on {@code Thread} instances.
*
* @param millis
* the time to wait in milliseconds
*
* @throws IllegalArgumentException
* if the value of {@code millis} is negative
*
* @throws InterruptedException
* if any thread has interrupted the current thread. The
* <i>interrupted status</i> of the current thread is
* cleared when this exception is thrown.
*/
public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;

if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}

if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
阅读全文 »

Thread#sleep()

/**
* Causes the currently executing thread to sleep (temporarily cease
* execution) for the specified number of milliseconds, subject to
* the precision and accuracy of system timers and schedulers. The thread
* does not lose ownership of any monitors.
*
* @param millis
* the length of time to sleep in milliseconds
*
* @throws IllegalArgumentException
* if the value of {@code millis} is negative
*
* @throws InterruptedException
* if any thread has interrupted the current thread. The
* <i>interrupted status</i> of the current thread is
* cleared when this exception is thrown.
*/
public static native void sleep(long millis) throws InterruptedException;
阅读全文 »