关闭

多线程之锁机制

标签: 线程
113人阅读 评论(0) 收藏 举报
分类:
  1. 在java虚拟机环境下,需要对以下两种线程共享的区域进行加锁

1.保存在堆里面的对象
2.保存在方法区里的类变量
java的锁机制
实际在jvm中每个对象或者类都会绑定一个监视器相关的锁,为了实现监视器的排他性监视功能,分别绑定对象的实例变量和类的实例变量。一个锁代表每次只能有一个线程进行访问,一个线程可以对对象多次加锁控制,对于每个对象,jvm维护一个加锁计数器,线程每次获得一个对象就加1,释放这个对象时就减1,直到加锁计数器为0时才真正释放这个对象的锁。java编程人员不需要自己动手加锁,对象锁是java虚拟机内部使用的。在java程序中,只需要使用synchronized块或者synchronized方法就可以标志一个监视区域。当每次进入一个监视区域时,java 虚拟机都会自动锁上对象或者类。
保证线程安全方式:synchronized和lock锁

synchronized

注意:
对于同步方法锁是当前实例对象
对于同步方法块,锁是Synchonized**括号里配置的对象**。
对于静态同步方法,锁是当前对象的Class对象

Lock

使用锁来保证线程安全

区别

首先他们肯定具有相同的功能内存语义

1、与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票

2、ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合(以后会阐述Condition)。

3、ReentrantLock提供了可轮询的锁请求。它会尝试着去获取锁,如果成功则继续,否则可以等到下次运行时处理,而synchronized则一旦进入锁请求要么成功要么阻塞,所以相比synchronized而言,ReentrantLock会不容易产生死锁些。

4、ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。

5、ReentrantLock**支持中断处理**,且性能较synchronized会好些。

0
0
查看评论

java 多线程等待与唤醒机制

java 并发编程网站 :http://ifeve.com/java-7-concurrency-cookbook/ 一: 1:JVM线程状态 NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING,&#...
  • baiducheng
  • baiducheng
  • 2017-12-25 16:08
  • 58

Java学习---多线程之锁机制

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-在程序中,对共享变量的使用一般遵循一定的模式,即读取、修改和写入三步组成。之前碰到的问题是,这三步执行中可能线程执行切换,造成非原子操作。锁机制是把这三步变成一个原子操作。1、synchronized 把代码块声...
  • wangxiaobinglanmuyu
  • wangxiaobinglanmuyu
  • 2015-11-12 14:56
  • 109

java 多线程 future 基本原理

/** * Date:2016年9月7日下午7:56:03 * Copyright (c) 2016, www.bwbroad.com All Rights Reserved. * */ package test.condition; import java.util.LinkedLis...
  • xuejianxinokok
  • xuejianxinokok
  • 2016-09-12 22:23
  • 513

多线程之使用信号量

引言信号量作为GCD的一部分,常用于多线程或任务间协作,当一个任务的执行过程中需要依赖另一个任务时即可使用信号量。实现原理信号量通过信号计数来实现。其使用即计数过程可分为三个部分:创建信号量、等待信号与释放信号。 创建信号量 函数为dispatch_semaphore_t dispatch_sem...
  • l964968324
  • l964968324
  • 2015-09-10 18:56
  • 437

JAVA基础学习(十二)--多线程一线程之间的通信

线程之间的通信
  • ko0491
  • ko0491
  • 2015-09-18 16:10
  • 205

Swift - 多线程实现方式(3) - Grand Central Dispatch(GCD)

1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:(1)NSThread(2)Cocoa NSOperation(NSOperation和NSOperationQueue)(3)Grand Central Dispath(GCD)2,本文着重介绍Grand Central...
  • offbye
  • offbye
  • 2016-02-26 11:24
  • 2402

WIN32多线程编程( CreateThread 版本)

win32多线程没有想象中的那么难,从线程创建到运行再到结束所涉及的接口只需三个,而且大部分参数都使用默认值。本文没有讨论多线程间的互斥与同步,以后有可能会补上。
  • XXJ1005
  • XXJ1005
  • 2015-04-29 10:38
  • 369

[iphone开发多线程之]多线程之NSInvocationOperation

来源:http://c.gzl.name 多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编程方法。 本次介绍NSOperation的子集,简易方法的NS...
  • ipromiseu
  • ipromiseu
  • 2010-07-27 00:28
  • 1489

java多线程——线程间通信之线程等待唤醒机制

三个方法 wait() notify() notifyAll() 三个方法都使用在同步中,因为要对持有锁(又叫监控)的线程操作。 所以要使用在同步中,因为只有同步才具有锁。 为什么这些操作线程的方法均出现在Object类中? 因为这些方法在操作同步中的线程时候,都必须要标识所操作线程识有...
  • u011402596
  • u011402596
  • 2015-04-10 01:16
  • 895

Rhyme/Java多线程之生产者消费者问题(等待唤醒机制、虚假唤醒、锁机制)

Java多线程之生产者消费者问题(等待唤醒机制、虚假唤醒、锁机制) 本篇博客由浅入深,先从最基础的生产者消费者问题讲起,然后依次深入 普通的生产者消费者问题 首先我们有一个店员类,模拟进货和卖货操作,店里的商品数量最多为10个 注意这里我们给进货和卖货方法都加了synchronize...
  • MapleSky2017
  • MapleSky2017
  • 2018-02-02 17:17
  • 24
    个人资料
    • 访问:9274次
    • 积分:680
    • 等级:
    • 排名:千里之外
    • 原创:57篇
    • 转载:5篇
    • 译文:0篇
    • 评论:5条
    最新评论