Java多线程进阶知识梳理(上)

目录

1.什么是JUC并发编程

2.线程和进程

3.Lock(锁)

4.生产者和消费者

5.集合线程不安全

6.Callable接口

7.常用辅助类(必须会)

7.1.CountDownLatch(减法计数器)

7.2.CyclicBarrier(加法计算器)

7.3.Semaphore(信号量)

8.ReadWriteLock(读写锁)

9.阻塞队列(BlockingQueue)

10.同步队列SynchronousQueue



1.什么是JUC并发编程

全称:java.util.conconcurrent

2.线程和进程

进程:一个程序,一个进程往往包含多个线程,至少包含一个

Java默认有几个线程? 2个,main,GC

线程:Thread,Runnable,Callable

Java真的能开启线程吗?开不了,start()方法底层直接调用的是C++(native方法)

并发和并行

并发:多个线程操作同一个资源。

一核CPU,多线程快速交替执行

并行(多个人一起行走)

多核CPU,多线程可以同时执行;线程池

并发编程的本质:充分利用CPU的资源

线程在java中的6中状态

NEW(创建),RUNNABLE(就绪),BLOCKED(阻塞),WAITING(死死等),TIMED_WAITING(超时等),TERMINATED(终止)

在操作系统中的5中状态:创建,就绪,运行,阻塞,终止

wait和sleep区别:

1.来着不同的类

wait  => Object

sleep => Thread

2.关于锁的释放

wait会释放锁,sleep不会释放锁,抱着锁睡觉

3.使用的范围是不同的

wait:必须在同步代码块中使用

sleep:可以在任何地方使用(Thread.sleep()或者TimeUnit.SECONDS.sleep())

3.Lock(锁)

sychronized本质是队列+锁

@Test
	@DisplayName(value = "JUC编程")
	public void test2() throws InterruptedException {
		TicketStation ticketStation = new TicketStation();
		new Thread(() -> {
			for (int i = 0; i < 40; i++) {
				ticketStation.scale();
			}
		}, "A").start();
		
		new Thread(() -> {
			for (int i = 0; i < 40; i++) {
				ticketStation.scale();
			}
		}, "B").start();
		
		new Thread(() -> {
			for (int i = 0; i < 40; i++) {
				ticketStation.scale();
			}
		}, "C").start();
	}

}

class TicketStation {
	private int num = 40;
	
	public synchronized void scale() {
		if(num > 0) {
			System.out.println(Thread.currentThread().getName

你可能感兴趣的:(多线程)