多线程的操作相关

参照博客:
https://www.cnblogs.com/fengsehng/p/6048610.html

为什么引入Executor线程池框架
new Thread()的缺点

每次new Thread()耗费性能
调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞争,会导致过多占用系统资源导致系统瘫痪。
不利于扩展,比如如定时执行、定期执行、线程中断
采用线程池的优点

重用存在的线程,减少对象创建、消亡的开销,性能佳
可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
提供定时执行、定期执行、单线程、并发数控制等功能
Executor的介绍

在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。
Executor框架便是Java 5中引入的,

其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。

Executor框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。

线程之间的通信,java5之前的老的api的要点:

volatile

volatile 定义的变量,特殊性在于:

一个线程对 volatile 变量的写一定对之后对这个变量的读的线程可见。

等价于

一个线程对 volatile 变量的读一定能看见在它之前最后一个线程对这个变量的写。

synchronized 使得

它作用范围内的代码对于不同线程是互斥的,并且线程在释放锁的时候会将共享变量的值刷新到共享内存中。

我们可以利用这种互斥性来进行线程间通信。看下面的代码,

volatile 和 synchronized比较

根据以上的分析,我们可以发现volatile和synchronized有些相似。

当线程对 volatile变量写时,java 会把值刷新到共享内存中;而对于synchronized,指的是当线程释放锁的时候,会将共享变量的值刷新到主内存中。

线程读取volatile变量时,会将本地内存中的共享变量置为无效;对于synchronized来说,当线程获取锁时,会将当前线程本地内存中的共享变量置为无效。

synchronized 扩大了可见影响的范围,扩大到了synchronized作用的代码块。

final 变量

final关键字可以作用于变量、方法和类,我们这里只看final 变量。

final变量的特殊之处在于,

final 变量一经初始化,就不能改变其值。

这里的值对于一个对象或者数组来说指的是这个对象或者数组的引用地址。因此,一个线程定义了一个final变量之后,其他任意线程都拿到这个变量。但有一点需要注意的是,当这个final变量为对象或者数组时,

虽然我们不能讲这个变量赋值为其他对象或者数组,但是我们可以改变对象的域或者数组中的元素。

线程对这个对象变量的域或者数据的元素的改变不具有线程可见性。

博客可以参考https://blog.csdn.net/u011794238/article/details/50748382

视频可以参考 网盘里的互联网架构师第二期-视频部分,前面几节课,很有用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值