java并发编程学习笔记一并发编程中线程的基础知识

线程安全

基本概念:

什么是线程安全:

  • 一个类被多个线程以任意方式同时调用,且不需要外部额外同步和协同的情况下,仍然保持内部数据正确且表现正确的行为,那么这个类就是线程安全的。

线程安全的等级

1.不可变类
* final 修饰的不可变类,如String ,Interger等
* enum 枚举类 底层表现为final修饰的类

那么final修饰的类或者对象一定是线程安全的吗?
答:①当你创建一个对象的时候,使用final关键字能够使得另一个线程无法在__创建过程中__,访问,否则是会可能发生的。
②final只是用来保证值不能被直接覆盖的。

2.线程安全类

线程安全类保证任意方法操作都不会使得该对象的数据处于不一致或者数据污染的情况。
java.util.concurrent

3.有条件的线程安全类

对于单独的访问类的方法,是线程同步的,但是对于某些复合操作,需要外部类来同步。

4.线程兼容类

1.正确使用同步
2.用锁或synchronize块包含每一个方法调用

  • Collectiong.SynchronizeList来包装一个list,使其变成一个线程安全的
5.线程对立类

无法兼容的类

线程的同步异步,阻塞与非阻塞

1.区分同步异步,阻塞与非阻塞

  • 同步:阻塞式调用,调用方必须等到响应方执行完毕后才会返回
  • 异步:非阻塞式调用,立即返回,调用方无需等到响应方返回实际结果,响应方会通过状态、通知或者回调来告知调用方
  • 阻塞:调用结果返回之前,当前线程会被挂起,只有得到结果只会才会返回
  • 非阻塞:不能立即得到结果之前,该调用不会调用当前线程,而会立即返回

2.梳理同步异步的使用场景

3.分清同步异步的优势劣势

优势:

  • 1.同步: 拿到实时结果进行处理,上下文信息始终在一代码块上,代码处理更加方便直接,同时对于错误和异常的处理可以做到实时
  • 2.异步: 不影响主流程的执行,降低响应时间,提高应用的性能和效率,及时的释放资源,如线程占用,让系统去做更多有价值的事。

劣势:

  • 同步 耗时的接口响应会影响整个流程的性能
  • 异步 未来保障数据最终一致性,需要对账系统去做好监控和保障,同时需要更多的异步任务去补偿数据一致性

总结

同步异步 关注点是得到结果的方法,同步是实时返回结果,异步是通过共享变量,通知消息或者回调来得到结果。
阻塞非阻塞 关注点在于程序等待调用结果返回的状态

线程的并发和并行

并发并行的基本概念

并发并行都是多线程程序
并发的定义:

  • 逻辑上的同时处理,能处理多个事件,但是并不一定是同时进行的

并行:

  • 物理上的同时进行,真正的同时处理

线程状态以及java中线程常见方法

1.线程的不同状态

1.new

线程已被创建,但是并没有启动

2.RUNNABLE

线程是可运行状态,正在jvm虚拟机使用,但是不一定正在被操作系统执行

3.BLOCKED

阻塞的线程意味着正在等待监视器锁,来重新进入或者重入synchronized代码块或者方法

4.WATING

等待状态,需要其他线程中断或通知来唤醒

5.TIMED_WAITING

定时等待状态,在指定时间后返回,或被提前其他线程中断或者通知返回

6.TERMINATED

终止线程的线程状态,线程已经执行完毕

2.线程不同状态的切换

3.几个常见的Thread方法用途和示例

  • 1.Thread.yield: 线程让步,使用这个方法,当前线程会退出CPU时间片,让其他线程或当前线程使用CPU时间片执行
  • 2.Thread.sleep: 线程休眠,主动让出当前CPU时间,在指定时间过后,CPU会返回继续执行该线程,!!!sleep方法不会释放当前持有的锁
  • 3.Thread.join: 等待该线程的死亡/终结,当前线程会等待调用该方法的线程执行完毕后继续执行
  • 4.Object.wait: object类的方法,调用前必须拥有对象锁,例如在synchronize代码块中,调用wait方法后,对象锁会被释放,进入WAITING等待状态

线程死锁

1.死锁的概念和发生原因

死锁: 两个或者两个以上的进程,各自占用一部分资源且不释放,并请求获取更多的资源,因而造成阻塞状态

  • 两个以两个以上的线程,请求两把以上的锁,且请求顺序不同

产生原因:

  • 互斥条件:申请的资源不能被同时占用
  • 不可剥夺:资源在未使用完毕之前,不能被其他进程抢占
  • 请求和保持:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放
  • 循环等待:存在循环等待链

2.发现线程死锁的方法

3.如何避免代码出现线程死锁

  • 1.破坏占用等待,一次性请求所有的资源
  • 2.破坏不可抢占,在一段时间得不到满足的情况下,释放持有的资源
  • 3.破坏循环等待,将资源统一编号,申请者必须顺序请求
  • 4.破坏互斥条件,一般不实现。
发布了18 篇原创文章 · 获赞 2 · 访问量 380

猜你喜欢

转载自blog.csdn.net/weixin_40907792/article/details/104147681