synchronize的可见性和原子性

synchronize: 可以保证变量可见性和一段代码的原子性
JMM关于synchronized的两条可见性规定:
  *线程解锁前,必须把共享变量的最新值刷新到主内存中
  *线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值

参考:

https://blog.csdn.net/weixin_42354330/article/details/81944625

 

ReentrantLock的可见性保证

AQS 中的 state 是 volatile的. volatile为了保证可见性, 会在机器指令中加入lock指令, lock强制把缓存(工作内存)写回内存(主内存), 并失效其它线程的缓存行(MESI). 这里要注意的是, lock并不仅仅只是把被volatile修饰的变量写回主内存, 而是把工作内存中的变更都写入主内存

参考:

https://blog.csdn.net/kobexzf/article/details/85214975

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: reentrantlock和synchronize都是Java中用于实现线程同步的机制。 synchronize是Java中最基本的同步机制,它可以用于同步方法和同步代码块。synchronize的实现是基于Java对象的内置锁(monitor)来实现的,每个Java对象都有一个内置锁,当一个线程访问一个同步方法或同步代码块时,它会自动获取该对象的内置锁,其他线程则必须等待该线程释放锁后才能访问该方法或代码块。 reentrantlock是Java中的高级同步机制,它提供了更多的功能和灵活。reentrantlock可以用于同步代码块,但不能用于同步方法。reentrantlock的实现是基于Java的Lock接口来实现的,它提供了更多的方法来控制锁的获取和释放,例如可以设置锁的公平、可以中断等待锁的线程、可以获取锁的持有者等。 总的来说,synchronize是Java中最基本的同步机制,使用起来简单方便,但功能相对较少;reentrantlock是Java中的高级同步机制,功能更加强大,但使用起来相对复杂一些。在实际开发中,应根据具体情况选择合适的同步机制。 ### 回答2: ReentrantLock和synchronize是Java中用于实现线程同步的两种机制。 ReentrantLock是Java.util.concurrent包中提供的一种可重入的互斥锁。相比synchronize,ReentrantLock提供了更灵活的锁定机制。通过调用lock()方法获取锁,调用unlock()方法释放锁。与synchronize相比,ReentrantLock具有锁的可重入,即同一个线程可以多次获取同一个锁,而不会被阻塞。此外,ReentrantLock还可以实现公平锁和非公平锁的机制,通过构造方法传入不同的参数即可。ReentrantLock还提供了Condition对象,可以在某个条件满足时进行等待或唤醒线程。 synchronized是Java中的关键字,可以用于实现线程同步。使用synchronized关键字时,需要在方法或代码块前加上关键字synchronized。当某个线程进入synchronized方法或代码块时,会自动获取对象的锁,其他线程会被阻塞直到锁被释放。相比ReentrantLock,synchronize不需要显式地获取和释放锁,也不需要处理异常情况。此外,synchronize是非重入锁,即同一个线程再次获取同一个锁时会被阻塞。 总体而言,ReentrantLock提供了更强大、灵活和可靠的线程同步机制,然而使用ReentrantLock需要更多的代码控制和异常处理。而synchronize则更为简单,在一些简单的场景下可以更方便地实现线程同步。根据实际需求和场景的不同,可以选择适合的机制进行线程同步。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值