Java小白学习指南【day15】---多线程+线程安全

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以后针对并发访问提出一种锁,灵活性 效率更高,但是需要手动的加锁和释放锁

猜你喜欢

转载自blog.csdn.net/WLK0423/article/details/109587379