多线程总结

1 , 线程的生命周期

创建 ----> 就绪 ----> 运行 ---> 结束


1, 创建线程,通过自定义类继承Thread类,或者实现runnable接口, 复写run方法, 创建自定义线程


2, 当执行start()方法, 该线程进入就绪状态, 但是并没有执行, 有执行资格,但是还没有执行权 , 需要抢到CUP资源才有执行权

 

3, 当该线程抢到CUP资源, 就开始运行, 对于单核服务器 , 同一时间只有一个线程在运行,除非是多核处理器 , 当一个线程在运行, 其他线程均处于就绪等待状态


4, 运行的线程 , 当run方法结束 ,或者执行了stop() ,interrupt()方法 , 该线程即结束


5, 运行中的线程可通过wait().Sleep() 方法进入阻塞状态 , 通过notify() 方法唤醒阻塞状态的线程, 该线程进入就绪状态, 重新开始等待, 获取CUP执行权, 才有资格执行 .


2 , 线程安全问题

1 , 线程安全问题产生的环境

1)     是否多线程环境2) 是否有共享数据 3) 是否有多条语句同时操作共享数据


2 , 解决方案 (同步)

我们无法修改多线程环境 , 无法修改共享数据 , 可以考虑解决多条语句同时操作共享数据的问题 , 如果让某个线程操作共享数据的时候, 其他线程不能操作共享数据 , 就可以解决线程安全问题 , 可以对多条语句操作共享数据的代码进行处理 , java已经已经提供了使用同步代码块的方式解决 ,

 Synchronized(对象){

    // 需要同步的代码

}

1)     该对象如同一把锁, 如果是同一个对象 , 则是同一把锁 , 如果使用不同的对象 , 则仍然无法解决线程安全问题 , 就好像一个房间开了多个门一样, 每个们都可以同时进出

2)     需要同步的代码, 即为多条语句操作共享数据的代码


3 , 同步的不同场景应用

同步不仅可以同步代码块 , 还可以同步方法 , 同步方法是将synchronized关键字加到方法上 , 静态方法同理是加在方法上 , 为了保证线程安全, 必须使锁是同一把锁 , 同步代码块的锁 , 同步方法的锁, 同步静态方法的锁是不同的

1)     同步代码块的锁是任意对象, 但是必须保证锁是同一把

2)     同步方法的锁 , 是this对象

3)     同步静态方法的锁 , 是当前类的class对象


3 , 线程死锁问题


通过同步代码块,同步方法, 同步静态方法 可以解决线程安全问题 , 当解决线程安全问题后, 会留下效率慢的问题, 死锁问题 .

死锁问题 : 就是两个或两个以上的线程因为争抢系统资源, 出现相互等待的情况, 使系统停止

4 , 线程通信


当不同类型的线程, 不同方向的线程, 操作同一个资源, 例如生产者和消费者,此时必须让资源为同一个资源,防止生产者生产的是馒头,而消费者只想买包子的问题发生

5 , 生产者和消费者问题





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值