并发基础知识

目录

一、线程基本概念

二、线程间安全竞争统一资源机制:synchronized

三、线程间的基本协作机制:wait/notify

四、取消\关闭线程机制:中断

-------------------------------------------------------------------------------------------------------------------------------------------------

一、线程基本概念

1、创建线程

线程是一条单独的执行流,有自己的程序计数器和栈。

2、创建线程的两种方式:

  1. 继承Thread(java.lang.Thread这个类表示线程),重写run()
  2. 实现Runnable接口,重写run()

注:1)两者启动线程都需要创建一个Thread对象,并使用start()方法来启动。

       2)start()表示启动该线程,使其成为一条单独的执行流,操作系统会分配线程相关的资源,每个线程会有单独的程序执行计数器和栈,操作系统会把这个线程作为一个独立的个体进行调度,分配时间片让他执行,执行的起点是run()。

       3)如果不用start(),用run(),则run()的代码仍然在main线程中执行。

3、线程基本属性和方法

      1)id和name

      2) 优先级

      3) 状态

          Thread有一个方法获取线程的状态:public State getState()  返回的State是一个枚举类

           public enum State{

            NEW,                  没有调用start的线程

            RUNNABLE,       线程正在运行(并不是指CPU刚刚好在运行此线程)

           BLOCKED,          被堵塞

           WAITING,            等待

           TIMED_WAITING,等待

           TERMINATED;            线程运行结束            }

       4)是否daemon线程(辅助线程)

              当程序中只有daemon线程时就会退出。

       5)sleep方法

            public static native void sleep(long millis) throws InterruptedException

      6)yield方法

            告诉操作系统的调度器让出时间,但操作系统不一定会听

      7)join方法

           可以保证main线程在子线程结束后在退出。

4、共享内存及可能存在的问题

当出现以下两种情况时,不同线程访问操作相同的代码会出现问题:

1)竞态条件

当代码中的操作不是原子操作,例如count++,在执行过程中有其他线程插入,会导致最后的count总数不准确。

解决方法:

  1. 使用synchronized关键字
  2. 使用显式锁
  3. 使用原子变量

2)内存可见性

一个线程对内存的修改,另一个线程看不到,一是修改没有及时同步到内存,而是另一个线程根本没从内存读。(可能在缓存中修改了但未来得及修改到内存中)

解决方法:

  1. 使用volatile关键字
  2. 使用synchronized关键字或显式锁同步

 

二、线程间安全竞争统一资源机制:synchronized

同步机制有synchronized与Lock两种锁方式

synchronized锁

1)使用synchronized加在方法上时,会获取该对象的锁。如果该锁被其他线程占用,则当前线程会等待,当synchronized方法正常返回或者抛异常而终止,jvm会自动释放对象锁。方式为以下两种:

public synchronized void get(){
   //执行逻辑
}



public void get(){
   synchronized(this){
   //执行逻辑
   }
}

2)使用synchronized加在静态方法\代码块上时,会获取该类的锁。类锁是用来控制静态方法(或静态变量)之间的同步的。

public static synchronized void get(){
   //执行逻辑
}


public void get(){
   synchronized(SynchronizedDemo.class){
   //执行逻辑
   }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值