Java Thread&&Problems

我们知道,一个进程对应一组PCB,那么PCB在操作系统内核中,它分为就绪队列和阻塞队列,采用双向链表进行管理。

线程有六种状态

NEW:操作系统内核未创建线程;

Terminated:线程运行结束,已销毁

Runnable:线程处于就绪态:1.已经在CPU上运行了;2.处在就绪队列中

Blocked: 这是调用了Sleep;

waiting:调用了wait方法

timed-waiting:线程调用sleep

前三种状态是主要状态;后面三种状态都是各种原因进行阻塞的状态。相应的代码如下:

public class Demo13 {
    public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
               System.out.println("thread");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }

        });
        System.out.println(thread.getState());//未创建线程的状态
        thread.start();//启动线程
        Thread.sleep(500);
        System.out.println(thread.getState());
        thread.join();//调用后结束线程
        System.out.println(thread.getState());//线程销毁后的状态
    }
}

多线程并发执行,提高了代码执行率,那么同样的也造成一些安全问题,原因如下:

1.操作系统的随机调度/抢占式执行【对于这种方式,我们是无能为力】

2.多个线程修改同一变量

解决方案:通过调整程序的设计,破坏上面的条件

3.部分修改操作TM不是原子的

解决方案:通过枷锁操作,就可以把一些不是原子的操作打包成一个原子操作

4.内存可见性

5.指令重排序

4和5的问题都是通过volatie关键字来进行解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值