1.多线程的实现方式 实现关系(Runnable)
步骤目录
-
自定义一个类,实现Runnable接口,重写run方法
-
在用户线程(main)中创建当前"资源类"对象,然后创建Thread类,将"资源类"对象作为参数传递
-
public Thread (Runnable target,String name)
-
分别启动线程: 对象名打点访问start() 启动线程
2.多线程的继承方式
-
<1>继承Thread
-
自定义类
-
重写Thread类的run方法
-
创建对象,启动线程start
3.共享资源类
synchronized:关键字----内置语言实现的(jvm来实现锁定操作:锁的释放:自动释放)
可以使通过代码块(代码中),可以在方法上使用(同步方法)
synchronized同步锁------属于"悲观锁"
悲观锁:自己线程本身在执行的时候,其他线程不能进入同步代码块中其他线程不能进入,修改数据,保证数据的安全性!(针对频繁的写入操作)
4.校验多线程安全问题的标准是什么
- 查看当前程序是否是多线程环境
- 是否存在共享数据
- 是否有多余语句对共享数据进行操作
注意:1.2都必须具备:现在使用的就是多线程环境,而且存在共享数据,从3入手
java提供一个同步机制:将多条语句对共享数据操作的使用同步代码块包裹起来
格式: synchronized(锁对象){//多线程必须使用同一把锁(可以任意java类对象),将多条语句对共享数据操作
}
5.java代理模式----结构型设计模式
静态代理:
同一个借口;特点:代理角色和真实角色必须同一个借口
动态代理:
JDK动态代理:基于接口
CGLib动态代理:基于子类
6.Java锁
- JDK5以后java提供了比synchronized,更广泛的锁定操作,程序员可以在某个位置自己去加锁. 弊端:手动释放锁
- java.util.concurrent.locks.Lock 接口 不能实例化
- 提供成员方法
void lock():获取锁; void unlock():手动试图释放锁; ReentrantLock:子实现类,可重复的互斥锁!4
synchronized:关键字===>内置语言实现====>通过jvm条用的,由jvm自动释放锁,它不仅仅可以应用在方法体中,也可以引用在方法上
lock:是一个接口, 手动加锁和手动释放锁, 一般都是在方法中的语句中使用
7.synchronized
虽然synchronized可以解决线程安全问题:同步代码/同步方法,但是执行效率低,可能出现死锁;
解决死锁问题方案:"生产者消费者思想" 必须保证多个多线程必须使用的同一个资源对象
目录
在用户线程(main)中创建当前"资源类"对象,然后创建Thread类,将"资源类"对象作为参数传递
public Thread (Runnable target,String name)