1、线程
计算机中的线程:应用执行的最小单位。
计算机中的进程:计算机调度和分配资源的最小单位
java中的线程:程序中某个需要被执行的任务
计算机中cpu调度资源是在各个线程之间进行切换
创建线程的两种方式:
1、继承Thread类
继承Thread类-----》子类中重写run方法-----》创建自定义线程的对象-----》调用start方法,开启新的线程
2、实现Runnable接口
创建Runnable实现类-----》在实现类中重写run方法-----》创建实现类的对象-----》创建Thread类的对象,同时将实现类的对象作为参数进行传递-----》调用start方法,开启新的线程,执行任务
run与start的区别?
run只是普通方法,调用run方法不会开启新的线程。
start是Thread类中提供的方法,会开启新的线程,同时jvm会自动去调用run方法。
线程的五种状态:新建-----》就绪-----》运行-----》阻塞-----》死亡
2、线程安全问题
产生的原因:多个线程共同访问一个资源,出现数据不一致的情况称之为线程安全问题。
解决方式:加锁
1、synchronized同步锁
需要一个监听对象,保证监听对象的唯一性
synchronized(监听对象){
//可能出现线程安全的代码
}
注意:
同步代码块
1、监听this不能满足唯一性,达到线程安全,因为this是谁调用就指向谁
2、监听字节码文件可以,例如:类名.class
3、监听普通对象不能保证线程安全性,需要加上static共享
4、监听字符串常量可以,但是注意字符串常量池
同步方法
1、同步普通方法不行,原因类似于监听this
2、同步静态方法可以,类似于监听字节码文件
2、lock锁
//创建lock对象,多态方式
Lock lock = new ReentrantLock();
//上锁
lock.lock();
try{
//可能出现线程安全的代码
//加上try是为了保证不会编程死锁
}finally{
//解锁
lock.unlock();
}
3、synchronized 与 Lock区别?
相同点:都是通过上锁来保证线程安全问题
不同点:
synchronized 是jvm级别的,由jvm来负责释放锁等问题,性能较低
Lock是jdk1.6以后针对并发访问提出一种锁,灵活性 效率更高,但是需要手动的加锁和释放锁