JAVA synchronized关键字锁机制(中)
synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选。 下面总结其特性以及使用技巧,加深对其理解。
特性:
1. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
2. 当一个线程同时访问object的一个synchronized(this)同步代码块时,其它线程仍然可以访问非修饰的方法或代码块。
3. 当多个线程同时访问object的synchronized(this)同步代码块时,会存在互斥访问,其它线程会阻塞直到获取锁。
4. 当线程访问object的synchronized(this)同步代码块时,同一个线程可以多次获取锁,当然也不需要释放多次。获取和释放必须相同。
5. 所有的对象都可以获取锁,也可以释放锁。
6. 所有的类也可以获取锁和释放锁,因此静态方法也可以加锁。而特性同上。
猜想:
在jvm中对每个对象都有一个记录锁的状态,当同一个线程访问锁时候就会累加,其它线程访问要等到状态变为未锁状态,当让相同线程释放锁会累减。
质疑:
那么对于类锁来说,应该是所有对象都可以获取锁,那么锁是全局的对所有对象都有效?
public class SynchronizedMtdTest { public static void main(String[] args) { new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest.appendStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest.printStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest synchronizedMtdTest = new SynchronizedMtdTest();
synchronizedMtdTest.appendStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest synchronizedMtdTest = new SynchronizedMtdTest();
synchronizedMtdTest.printStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest synchronizedMtdTest = new SynchronizedMtdTest();
synchronizedMtdTest.append();
}
}).start();
} public synchronized static void appendStr() {
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr------");
try {
Thread.sleep(1000);
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr1000------");
} catch (InterruptedException e) {
e.printStackTrace();
} } public static void append() {
System.out.println("pid=" + Thread.currentThread().getId() + "------append------");
try {
Thread.sleep(3000);
System.out.println("pid=" + Thread.currentThread().getId() + "------append3000------");
} catch (InterruptedException e) {
e.printStackTrace();
} } public synchronized static void printStr() {
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr------");
try {
Thread.sleep(6000);
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr6000------");
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
结果:
pid=10------appendStr------
pid=14------append------
pid=10------appendStr1000------
pid=13------printStr------
pid=14------append3000------
pid=13------printStr6000------
pid=12------appendStr------
pid=12------appendStr1000------
pid=11------printStr------
pid=11------printStr6000------
分析结果可以看出对于静态方法加锁,所有的线程调用方法,不管怎样都会互斥,而为加锁不会互斥。
因此:
对于类锁来说应该在持久代也就是方法区有对具体类也有加锁机制,而且原理同对象锁。
那么:
可见,上面可以做如下修改达到相同效果。
public static void appendStr() {
synchronized (SynchronizedMtdTest.class) {
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr------");
try {
Thread.sleep(1000);
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr1000------");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void printStr() {
synchronized (SynchronizedMtdTest.class) {
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr------");
try {
Thread.sleep(6000);
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr6000------");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
结果:
pid=10------appendStr------
pid=10------appendStr1000------
pid=13------printStr------
pid=13------printStr6000------
pid=12------appendStr------
pid=12------appendStr1000------
pid=11------printStr------
pid=11------printStr6000------
JAVA synchronized关键字锁机制(中)的更多相关文章
- 由Java 15废弃偏向锁,谈谈Java Synchronized 的锁机制
Java 15 废弃偏向锁 JDK 15已经在2020年9月15日发布,详情见 JDK 15 官方计划.其中有一项更新是废弃偏向锁,官方的详细说明在:JEP 374: Disable and Depr ...
- Java Synchronized 关键字
本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchron ...
- Java synchronized 关键字详解
Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 sync ...
- JAVA多线程与锁机制
JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 ...
- 深入浅出Java并发包—锁机制(三)
接上文<深入浅出Java并发包—锁机制(二)> 由锁衍生的下一个对象是条件变量,这个对象的存在很大程度上是为了解决Object.wait/notify/notifyAll难以使用的问题. ...
- 深入浅出Java并发包—锁机制(二)
接上文<深入浅出Java并发包—锁机制(一) > 2.Sync.FairSync.TryAcquire(公平锁) 我们直接来看代码 protected final boolean tr ...
- java并发之线程同步(synchronized和锁机制)
使用synchronized实现同步方法 使用非依赖属性实现同步 在同步块中使用条件(wait(),notify(),notifyAll()) 使用锁实现同步 使用读写锁实现同步数据访问 修改锁的公平 ...
- [多线程] 线程中的synchronized关键字锁
为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...
- Java:synchronized关键字引出的多种锁
前言 Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁.本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这 ...
随机推荐
- windows 10激活
1.安装Microsoft Toolkit 解压,安装 2.打开Microsoft Toolkit软件 点击下面红色框框 等到出现下面内容后,继续下一步 3.点击下面按钮 等待片刻后,出现下面结果,就 ...
- 170608、Spring 事物机制总结
spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加 ...
- Yii2框架添加API Modules
原文链接:http://www.itnose.net/detail/6459353.html : 一.环境部署 1. read fucking Yii Documents. http://www.yi ...
- android的一些类库的优缺点
经过本人的面试经验,以及接触的android项目,总结了一下android的一些类库的优缺点: 一,线程方面 1.AsyncTask 首先是线程优化以及缺陷方面,针对目前大多数类库来说,都有好的设计方 ...
- Django - rest - framework - 上
一.快速实例 http://www.django-rest-framework.org/tutorial/quickstart/#quickstart http://www.cnblogs.com/y ...
- Winzip和Winrar命令行的使用
Winzip和Winrar除了提供丰富灵活的图形界面操作功能外,二者都还具备从命令行模式进行文件的压缩与解压缩操作功能,极大的方便了我们在批处理文件中调用压缩软件.以下给出了二者的常用命令行使用方法: ...
- java基础语法 List
List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引, ArrayList:底层的数据结构使用的是数组结构(数组长度是可 ...
- 7.3 Models -- Creating And Deleting Records
一.Creating 1. 你可以通过调用在store中的createRecord方法来创建records. store.createRecord('post', { title: 'Rails is ...
- Redis 监控方案
一.概述 近些天,遇到Redis监控的应用场景,从网上搜罗了一些文章,做了整理. 二.工具列表 2.1 redis-faina 见参考文章1 2.2 redis-live 见参考文章1 2.3 red ...
- STM32F105 USB管脚Vbus的处理
源:STM32F105 USB管脚Vbus的处理 对于STM32F105/107来说,为了监测USB的连接问题,程序默认是通过Vbus管脚进行检查的.但是Vbus管脚和UART1的TXD复用,导致我们 ...