多线程基础
这里主要讲synchronized
关键字,JUC
有另外的讲解
1、Synchronized简介
Synchronized作用
保证在同一时刻,最多只有一个线程执行该段代码,以达到保证并发安全的效果。
Synchronized的地位
- 是java关键字
- 是最基本的互斥手段
- 是并发编程的元老级角色,是并发编程的必学内容
不使用并发有什么后果
public class MissedRequest {
private static int num=0;
public static void main(String[] args) throws InterruptedException {
Thread a = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
num++;
}
}, "A");
Thread b = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
num++;
}
}, "B");
a.start();
b.start();
/**
* 使用join方法,是为了保证子线程能在主线程之前完成
* 在这里,因为a.start()方法,是在main线程里执行的
* 所以,主线程是main,子线程是A,B
*/
a.join();
b.join();、
/**
* 也可以使用下面这种方法
* 当前面的线程还在执行的时候,不会跳出这个循环
* 从而保证输出会在所有子线程结束后才会执行
*/
// while (a.isAlive() || b.isAlive()) {
//
// }
System.out.println(num);
}
}
2、Synchronized两种用法
对象锁
包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)
方法锁
同步代码块锁
锁this
如果要锁this,那起码要保证,每个子线程都是同一个对象
像我们下面这段代码,其锁的,都是同一个单例instance
public class SynchronizedObjectCodeBlock2 implements Runnable{
private static int num=0;
private static SynchronizedObjectCodeBlock2 instance=new SynchronizedObjectCodeBlock2();
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 10000; i++) {
num++;
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread a