多线程并发

1.并发就是对共享资源同时进行访问,而产生的现象。

2.线程的实现方式:继承Thread或实现runnable 都要重写run方法。

3.启动线程是通过Thread的start(用户进程)方法实现的。如果直接调用run(守护进程)方法启动的线程和当前主线生命是同时结束的。

4.共享变量:多个线程对同一个变量进行访问时,都是先从jmm主内存读取变量的值到自己的本地内存,等线程运行结束了后再把自己当前线程中本地变量的值刷回主内存。这样在多线程同时访问的情况下就会产生数据的紊乱和覆盖。

此时需要给共享变量增加volatile 来保证多线程之间共享变量的可见性,当变量被volatile修饰后各个线程自己的本地内存就不在起作用,而是直接读取jmm主内存中的值,修改完在放回去,当共享变量的值发生变化时会通知各个线程。

但是volatile不具有原子性,可能存在同时写数据的情况,此时就要在写操作时加锁。

5.并发的解决方式主要是通过加锁来实现的。锁有两类:分别是对象锁(synchronized (this)、方法加synchronized )和类锁(static synchronized 和 synchronized (*.class))

锁synchronized 同步代码块和Reentrantlock 的区别:

lock 可以实现公平锁,等待时间较长的优先处理;synchronized  每次都要竞争锁。

lock需要解锁操作;

lock可以设置超时时间自动释放锁;

在竞争不是很激烈 偶尔才有并发的情况下使用synchronized,在并发量大的情况下使用ReenableLock性能要好很多。

两者都能实现 原子性(一次只能有一个线程执行)、可见性和可重入性。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值