四种解决线程安全的方式:

多线程在面试的过程中经常会问到,这次在这个地方进行一个知识点的总结,在做web系统的时候,需要用到高并发的系统的,经常的考虑,这里就做一个简要的整理与回顾。
首先要明白两个概念:线程和进程、并行和并发的

线程和进程

进程和线程
进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。

什么是线程的安全的?
当多个线程访问一个对象的,若不考虑这些线程在运行环境的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,则线程是安全的。
线程不安全的集合中有list、set、hashamp、
线程安全的集合有hashtable、copyonwritearraylist、copyonwritearrayset
以及cunrrenthashmap

解决线程安全的四种方式

悲观锁:自己在使用数据的时候,一定有别的线程来修改数据,因此在获取数据的时候先加锁,确保数据不会被线程修改。
乐观锁:在使用数据时,不会有别的线程来修改数据,就不会加锁,只是在更新数据的时候去判断之前有没有别的线程来更新了数据。
1. 方法一:使用synchronized关键字
使用synchronized关键字,是一种悲观锁,使用的时候,需要有一个监听的对象并且对监听对象是唯一的,通常就是当前类的字节码对象。hashtable类就是使用的synchronized来进行修饰的,synchronized修饰类、静态的方法、普通的方法、普通的代码块和方法块等。最主要的是synchronized是jvm级别的,不会造成死锁的情况出现的。
eg:

	Hashtable中的源码示例:
	 public synchronized V put(K key, V value) {
   
        // Make sure the value is not null
        if (value == null) {
   
            throw new 
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值