Less than 1 minute
可见性
public class VolatileTest {
private static boolean running = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
System.out.println("Thread start, time: " + LocalDateTime.now());
while (running) {
}
System.out.println("Thread end, time: " + LocalDateTime.now());
}).start();
TimeUnit.SECONDS.sleep(3);
running = false;
}
}
About 2 min
Less than 1 minute
单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。单例与多线程没啥直接关系,但是保证多线程下单例模式的安全性,是件有趣且好玩的事情。今天我们就来聊聊这单例。
单例模式
饿汉模式
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
About 3 min
简单使用
https://www.baeldung.com/java-synchronized
可重入性
可重入锁是同一个线程重复请求由自己持有的锁对象时,可以请求成功而不会发生死锁。与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。
public class SynchronizedTest {
static synchronized void parentMethod() {
childMethod();
System.out.println("parent");
}
static synchronized void childMethod() {
System.out.println("child method");
}
public static void main(String[] args) {
new Thread(SynchronizedTest::parentMethod).start();
}
}
About 2 min
如果想在线程中保存些数据,
ThreadLocal的使用
public class ThreadLocalTest {
public static void main(String[] args) throws InterruptedException {
var threadLocal = new ThreadLocal<>() {
@Override
protected String initialValue() {
return "huhx";
}
};
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
threadLocal.set("linux");
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
}).start();
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
}
}
About 2 min
在上一篇博客我们讲到什么是线程,这里我们来简单的介绍下线程的使用。
线程的创建
线程的创建有两种方式,一种是继承Thread类
,另一种是实现Runnable接口
。比较推荐的是实现Runnable接口
的这种方式。
Thread
本身是实现了Runnable
接口的,调用start()
方法会新建一个线程(这个逻辑存在于native方法start0
中)并让此线程调用run()
方法。
OriginalAbout 12 min
在java中稍微高级一点儿的话题,一定会涉及到多线程。那么线程到底是个什么东西,为什么让人如此的着迷和津津乐道?今天我们就展开对Thread的学习。
什么是线程
跟线程相关的概念
说服务端编程还是大量需要并行计算的,而Java也主要占领着服务端市场,那么对Java的并行计算的研究也就显得非常的必要。但首先,我想在这里先介绍几个重要的相关概念。
同步(Synchronous)和异步(Asynchronous)
同步和异步通常用来形容一次方法调用。同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中真实地执行。整个过程不会阻碍调用者的工作。
OriginalAbout 6 min