【计算机基础】线程篇:对线程安全的理解

目录

一、前言:谈谈自己的理解:

1、线程私有区:

2、线程共有区:

3、锁:

4、Voltile,Cas:

5、多线程和并发:

二、承上启下:


一、前言:谈谈自己的理解:

 
官方给出:线程是cpu调度的最小单位, 一个进程中有多个线程
 
cpu通过调度线程执行相应的汇编语言的指令来对数据进行操作,这些数据是java 通过编译后形成字节码,字节码 加载到jVM: java虚拟机中的内存中
 
为了保证数据的准确性,但是又要保证空间利用率能最高,所以分为了线程共有区,和线程私有区
 

1、线程私有区:

只有一个线程可以对里面的数据进行操作,有数据的隔离效果,保证数据不会被其他的线程修改:
如图:
 
这样保证的数据的安全。

2、线程共有区:

但对于 线程共有区:起一个名字叫堆 ,这个地方在JVM 的地方再详细的看。
为了保证线程之间共享的数据不乱套,就要给他们几条规则,大家都遵守,保证秩序不乱:
1、锁, 只有拿到锁的线程,可以对数据操作,没有拿到的等着 :monitorenter moitorexite  汇编指令:java中lock
2、变化可见,一个线程改了啥,你得告诉其他线程,让其他线程知道,其他线程也不能在没收到最新进展的通知就擅自开始自己的操作:lock 汇编指令 : java 中的 voltile :cas

3、锁:

锁和变化可见:
锁也有好用的不那么好用的:
太好用了吧,也就代表着没有人可以特殊,不存在插个队,这样效率上就低了,后来就进行了优化,让锁可以根据争抢的火热程度来决定它的严格程度,当没有人争抢的时候,用自己手里了和公共的一对比发现没人改,是一样的,就比对了一次(cas了一次)就可以修改,表示没有人和他争着用,那么就可以当作锁不存在,无锁的状态;之后cas发现需要等待了,那么就是存在竞争了,锁升级为偏向锁,然后是轻量级,最后是重量级,对象头中会有一个名字是MarkWord的内存存锁标志位 :锁的编码 01 、00、 10 三种

4、Voltile,Cas:

 
除了锁,就是变化可见:
变化可见说的是线程和线程之间对公共的东西的修改的可见性。上面也提示了voltile cas 保证了可见性和原子性。

5、多线程和并发:

另外对于了解线程安全的基本认识是多线程和并发的认识:
顺便给自己科普一下:进程和线程的关系:
 
      Java中main方法启动的是一个线程也是一个进程,一个java程序启动后它就是一个进程,进程相当于一个空盒,它只提供资源装载的空间,具体的调度并不是由进程来完成的,而是由线程来完成的。一个java程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作。Thread、Runnable的开启的线程是主线程下的子线程,是父子关系,此时该java程序即为多线程的,这些线程共同进行资源的调度和执行。
读过之后,想起来,大概如果main线程休眠,让出了cpu,那么其他线程也不能执行了。×错误
main休眠时,其他线程是可以执行的,但如果main线程是wait等待状态,其他子线程大概就不能执行了。
总结:
运行一个程序,点击run,运行程序。相当开启了一个进程。
 
1:程序是静态的。进程是动态的。
2:程序运行时,把代码写入内存要执行的数据池中执行,才形成了一个进程。
3:一个程序代码可以被多个进程调用。
 
 
如果是单线程其实也就不会有这些问题了,线程安全性主要是针对多线程高并发的时候出现的数据不一致不准确的情况。
怎么才能是多线程,什么样叫做并发?
正如上面介绍的,一个main一个线程,我们启动 一个小项目在没有用到thread的类的时候,其实启动了一个项目,开启了一个进程有一个主线程main。这都是单线程。
假如我的电脑作为一台服务器,别人通过我提供的链接可以访问到我这台电脑上公开给大家访问的程序,那么一个进程中就会出现多个调度资源的线程,即为多线程
 
个人理解,如果有偏颇欢迎指正。
 
当然在主线程main下也可以有多个子线程,一个线程里也是多个线程,有的时候为了加快一个程序的运行速度也会采用自己去创建线程的方式,形成多线程执行,更快一些。

二、承上启下:

所以如果想要熟练的运用多线程,并且保证线程安全,要了解的东西还有:
  1. 线程安全的关键字:final  threadlocal  voltile cas  synchronized lock
  2. 线程的创建使用和销毁:  thread runnable threadpool 辅助类CountDownLatch、CyclicBarrier和Semaphore
  3. 锁可以单独拿出来学习:AQS  锁分类  队列
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值