多线程--从共享变量到共享对象---法块synchronized+块Lock
基础
进程可进一步细化为线程,是一个程序内部的一条执行路径。
若一个进程同一时间并行执行多个线程,就是支持多线程的
线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开 销小
一个进程中的多个线程共享相同的内存单元/内存地址空间
它们从同一堆中分配对象,可以 访问相同的变量和对象。这就使得线程间通信更简便、高效。但多个线程操作共享的系统资 源可能就会带来安全的隐患。
每个线程 有各自的栈 和 程序计数器
方法区 + 堆 时一个进程一个。
故 多个线程 共享 方法区和堆。jvm调优 调的就是共享这块。

多个人同时做不同的事 ---- 并行
多个人做同一件事 ---- 并发
一个进程中的多个线程共享相同的内存单元/内存地址空间。它们从同一堆中分配对象,可以 访问相同的变量和对象!
4种创建方式 --- 从 共享变量(Thread) --> 共享对象(Runnable)
start() ,1 启动当前线程,2.JVN调用重写的run()方法。
子类重写的异常不能比父类高。
继承Thread(单继承限制)
+
实现Runnable (优点:没有单继承限制,对象能被共享即多个线程可以共享同一个接口实现类的对象,非常适合多个相同线 程来处理同一份资源。)
多线程公用变量-----------不想用static--对象共享静态变量-----------怎么办??
3个线程卖票,结果卖了300张票。 用static 避免300票。 不用static- 用runable线程---3个线程共用一个对象!一个对象就100票。

Runnable的方式 与代理模式-静态代理 类似???但相反??。 实现类是 被代理类,Thread 是代理类 ???
实现同一接口。静态代理 构造传的是目标对象,代理类增强目标对象。
new Thread(new Runnable(){ // Thread 是 代理类? new Ruannable是 目标对象。
run() {
}
})
两者结构有点像,实际作用并不同。
生命周期--排队打饭插队等

-------------

同步机制-解决安全问题---蹲坑--------(让多条语句操作变成一个原子操作)
多个线程操作共享数据---银行存取款。 主要问题就是 进入if业务后,全被阻塞了。都在if里面

锁要唯一,---> 对象要唯一! 所有线程用一把锁


Thread 类 线程 锁 用static Object。
this 是当前对象,调这个方法的就是this,谁能调用这方法? 当前类的对象! Runable可用this,Thread 可用类.class当锁

同步方法 --- 方法签名 加 synchronized修饰限定,Runnable可用,Thread不可用,为啥?因为 this不是唯一的。多线程从Thread共享变量到Runnable共享对象。

所以Thread同步方法要加static




同步解决问题一:懒汉式单例线程安全问题--------------方法二的优化,精妙之处

同步解决问题二:死锁-- 两个线程互相卡对方资源。互相拿住对方的锁--同步监视器。
jdk5新特性--Lock---子类ReentanntLock new ReentanntLock().lock(); 获取锁=同步监视器 最后unlock();


线程通信--- 必须是锁调用wait()和notify(),但锁可以是任意对象,所以wait()方法在Object类中。


线程安全问题解决3种方法-- 隐式锁/显示锁
同步方法,代码块,锁lock

call()----------回调方法。获取返回值


new Thread(new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
return "Callable task result";
}
})).start();
FutureTask ---> interface RunnableFuture<V> extends Runnable, Future<V> {
FutureTask肯定有run方法 给Thread使用start()。 其run调用的是Callable的call()

4大线程池----7大参数 cmtuqfh
核心线程数C-最大线程数M-空闲线程存活时间T-时间单位U-任务队列Q-线程工厂F-拒绝策略H
高级
并发
浙公网安备 33010602011771号