为了账号安全,请及时绑定邮箱和手机立即绑定

java多线程学习简单笔记

标签:
Java Linux

以下时java多线程学习的一些笔记和心得。

进程和线程

进程一般作为资源的组织单位。有自己独立的地址空间,包含程序内容和数据,不同的进程的地址空间时相互隔离的。进程拥有各种资源和状态信息,包括打开的子进程、文件和信号处理器。线程表示的是程序的执行流程,是CPU调度的基本单位,有自己的程序计数器、寄存器、堆和栈等。同一个进程中的线程共用进程的地址空间,同时共享进程拥有的内存和其它资源。

引入多线程的目的

引入线程的目的是为了解决效率问题,避免因为阻塞或者其它而导致的CPU性能无法充分利用的问题。一般影响线程执行效率的是在使用CPU和进行IO操作的时候。

实现多线程的基本方式

继承Thread类
class MyThread extends Thread{public void run(){code}}
或者实现Runnable接口,然后将实现了Runnable接口的对象作为参数传入Thread中构建一个Thread实例
class MyRunnable implements Runnable{public void run(){code}}
Thread thread = new Thread(new MyRunnable);
然后我们可以调用Thread实例的start()方法,就可以启动一个线程。

多线程引发的问题

可见性

在多线程程序中,当一个线程对共享变量所做的修改对于其它线程并不可见,导致其它的线程人然使用错误的值,就会造成可见性问题。在代码被运行时,对于一条代码语句,可能对应着虚拟机中多条的指令序列,由于CPU在调用线程时不可预知,那么就可能出现在执行某一条语句时,执行到其所对应的指令的间隙就切换到了其它线程执行,引发错误。
还有一种情况是和CPU相关的,现在的CPU一般采用多级缓存,多级缓存的引入是为了提高读取效率,增加CPU运算的性能,但是这样也会引发一些问题:由于线程在读取数据的时候是从主存时读取的,当一个线程对一个共享变量进行了修改的时候,这个变量没有及时地写入到主存中,而是暂时保存在了缓存中,那么CPU此时切换另一个线程运行时,读取到的时主存的原来的值。
另一个可能的原因是编译器出于对性能的考虑,可能会对生成的字节吗进行指令重排,优化指令的执行顺序,这也可能会引发多线程可见性问题。

点击查看更多内容
4人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消