在并发环境下,采用锁的方式来解决对共享资源的互斥访问。在Java中,锁可以分类如下两类:
对象锁
JAVA中所有的对象都有一个同步锁,每个同步锁会有一个计数器,JVM负责跟踪对象被加锁的次数,没有线程获取该对象的锁时,计数器的值为0,如果一个线程第一次对这个对象加锁,那么计数器的值就为1,之后相同的线程在获得该对象的锁时,计数都会递增的加1,如果相同的线程对此对象解锁,那么计数器就会减1,当计算器为0时,其他线程就可以获取到该对象的同步锁了,一般线程离开一个synchronized方法或者synchronized代码块计数器就会递减。
获取对象锁的方式:
第一种:
public synchronized void method() {};
第二种:
Object object = new Object();
public void method() {
synchronized(object) {
//方法体
}
}
类锁
其实没有什么类锁,所谓类锁实际上就是这个类的对象的对象锁,也就是说每个类都是一个java.lang.Class对象,类锁就是这个类的类对象锁。
获取类锁的方式:
第一种:
synchronized (xxx.class) {}
第二种:
synchronized (Class.forName("xxx")) {...}
第三种:
public static synchronized void method(){...}
如果想同时获取类锁和对象锁,也是允许的,但是在编程的过程中要注意锁嵌套导致死锁的问题。
释放锁
如下三种方式会释放同步锁:
1,正常运行完同步块,同步锁被释放。
2,运行同步代码块异常终止,同步锁也会被释放。
3,调用了同步锁所属对象的wait()方法,这个线程就会释放对象锁,进入对象的等待池中。
注:线程调用Thread.sleep或者Thread.yield方法并不释放同步锁,只是把运行的机会让给其他的线程。wait会释放同步锁。
本篇不打算举实例了,真正理解了锁机制,就能判断的出来。
分享到:
相关推荐
Java对象锁和类锁全面解析(多线程synchronized关键字)编程开发技术共14页.pdf.zip
利用锁对象和条件对象实现了对线程的控制,具体的讲解可以参考我的博客
主要介绍了Java类锁、对象锁、私有锁冲突测试,得出结论是加锁方法够成了竞争关系,同一时刻只能有一个方法能执行,需要的朋友可以参考下
主要介绍了java 对象锁与类锁的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
主要介绍了Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别,希望对大家有所帮助,一起跟随小编过来看看吧
同样是锁,先说说synchronized和lock的...2.synchronized可以锁住代码块,对象和类,但是线程从开始获取锁之后开发者不能进行控制和了解;lock则用起来非常灵活,提供了许多api可以让开发者去控制加锁和释放锁等等。
Lock接口实现的锁不一样,例如ReentrantLock锁是基于JDK实现的,有Java原生代码来实现的。 synchronized 锁的是什么? Object o = new Object(); synchronized (o){ System.out.println("执行代码"); } 上面这段...
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...
Java对象内存布局(对象头信息锁升级)示例
在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。 1.对象的锁 所有对象都自动含有单一的锁。 JVM负责跟踪对象被加锁的次数。... 2.1同步到单一对象锁 当使用同步块时,如果方法下的同步块
第2章 Java对象持久化技术概述 2.1 直接通过JDBC API来持久化实体域对象 2.2 ORM简介 2.2.1 对象-关系映射的概念 2.2.2 ORM中间件的基本使用方法 2.2.3 常用的ORM中间件 2.3 实体域对象的其他持久化模式...
对象所需内存大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从java堆中划分出来。根据java堆内存是否绝对规整,划分方法不同: 1)指针碰撞(Bump the Pointer): Java堆中内存绝对...
• 熟悉Java多线程并发中线程基本方法,线程池,线程生命周期,熟悉Java锁中常见锁分类(乐观/悲观锁、自旋锁、独/共享锁、可重入锁、公平/非公平锁、分段锁、偏向锁,轻/重量级锁)和基本的锁升级策略
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...
javacore.txt文件用jca打开,heapdump.phd文件用ha打开。...包括 Java 虚拟机的参数,环境变量,内存段的分配情况,垃圾回收日志,各种内部锁的状态,各线程在当前时刻的运行栈,以及类加载状态等。
基于java的锁具装箱源程序,可以很好的运行并且运行环境是myeclipse6.5 其他的不用过,不知道行不行,好像eclipse可以用
java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...
- 代码块(对象锁与类锁均可); 2. Lock 采用 lock()对代码加锁,unlock()进行解锁 参考文章:https://blog.csdn.net/yx0628/article/details/79086511 2、怎么利用反射获取类中的对象? 1. 获取 Class 对象 2. ...
主要介绍了解析Java编程之Synchronized锁住的对象,具有一定参考价值,需要的朋友可以了解下。