Java线程synchronized、Lock

java.util.concurrent.lock 中的Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为Lock 的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。

ReentrantLock 类实现了Lock ,它拥有与synchronized 相同的并发性和内存语义,但是添加了类似锁投票定时锁等候可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)

  • class  Lock lock =  ReentrantLock();
  •   output(String name) {
  •  {
  • ( i = ; i < name.length(); i++) {
  •  {
  • }

区别:

需要注意的是,用sychronized修饰的方法或者语句块在代码执行完之后锁自动释放,而是用Lock需要我们 手动释放锁,所以为了保证锁最终被释放(发生异常情况),要把互斥区放在try内,释放锁放在finally内!!

3、读写锁ReadWriteLock

上例中展示的是和synchronized相同的功能,那Lock的优势在哪里?

例如一个类对其内部共享数据data提供了get()和set()方法,如果用synchronized,则代码如下:

  • class   data;
  •    set( data) {
  • );
  •  {
  • );
  •  (InterruptedException e) {
  • .data = data;
  •  + .data);
  •     get() {
  • );
  •  {
  • );
  •  (InterruptedException e) {
  •  + .data);
  • }

然后写个测试类来用多个线程分别读写这个共享数据:

  • public  main(String[] args) {
  • //final Data data = new Data();    syncData data =  syncData();
  • //final RwLockData data = new RwLockData();  
  •  ( i = ; i < ; i++) {
  •  Thread( Runnable() {
  •   run() {
  •  ( j = ; j < ; j++) {
  •  Random().nextInt());
  •  + i);  
  •  ( i = ; i < ; i++) {
  •  Thread( Runnable() {
  •   run() {
  •  ( j = ; j < ; j++) {
  •  + i);  
  • }

注意!此信息未认证,请谨慎判断信息的真实性!

全部评论
空

相关内容推荐

头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像
投票
点赞 评论 收藏
转发
头像
2022-12-20 17:21
点赞 评论 收藏
转发
点赞 评论 收藏
转发
点赞 评论 收藏
转发
头像
2022-12-16 02:48
门头沟学院_2022
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
头像 头像
点赞 评论 收藏
转发
头像
点赞 评论 收藏
转发
点赞 收藏 评论
分享

全站热榜

正在热议