初学者谈线程

随手记录一下,方便与我一样的初学者理解线程。

线程,可以理解为程序的运行渠道。每多一个线程,其实就多了一个渠道。就像一条河一样,我挖一条河道就是一个线程,多条河道就是多条线程。那么他的作用其实就是就是为了分担压力(应对高并发这种情况存在),就像河道一样,河道越多,水就疏通的越快,压力就越小。

那么说一下线程安全,线程安全其实是对共享资源的安全保证,这样说吧,我们的系统有一个总体主存,而每一个线程则有自己专属的辅存,线程在对一个对象进行操作时,它会把修改结果先写到自己的辅存中,然后再提交给主存。而线程不安全的原因,就是一个对象,它被多个线程调用,这个时候,可能会发生这种情况,线程1对一个对象进行操作了,然后吧改变写到辅存里。然而,这个时候,硬件寄存器切换线程,然后线程2又操作这个对象,然后写到辅存,写到主存里。这个时候,又切换到线程1,然后把线程1修改的对象写到主存里。这样,在执行完毕后,我们只能看到线程1改变的结果,线程2的结果就这么被覆盖了。

那么有哪些方式针可以改变这种状况呢。明白线程安全其实是多个线程对一个资源进行操作发生的问题,那么我们可以对这个资源操作完直接改变到主存中,就不会出现这种情况。对共享的资源对象加上volatile关键字,就可以立刻写入主存,解决问题。

当然我们也可以用锁,必须得这个线程执行完毕后,别的线程才可以对这个资源进行操作,常用的有synchornized以及分布式锁,但这样效率就很低了,切换线程后,发现这个方法不能执行,卡壳,直到获取到锁,然后才能操作,挺慢的。

悲观锁,乐观锁也说一下吧。

悲观锁其实就是加锁,我执行不完,所有人别执行都等我,在数据库的操作语句在后方加一个for update,只要执行不完,别的操作就会一直阻塞在此处。

乐观锁其实就是基于设计层面的,就像数据库里我添加一个时间戳字段,只要这条记录改变,时间戳也会发生改变,那么在代码里执行时,我在修改前再查询一下这个时间戳,与代码中的时间戳进行对比,如果不相同的话,那么在代码中就可以阻塞,不让他修改。

公司里用的GUID,现在感觉就是为了多线程而添加的,当一个线程处理一个代码时,判断一下GUID是否是原先的那个,如果是,就证明这个对象没被别的线程操作,如果不是,则表示该对象已经被别的线程操作。(GUID我原先的公司设置的是时间戳,在线程操作时,改变时间戳,然后对比是否与原先相同)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值