JVM锁机制之synchronized
概述:
- 非静态方法
- 静态方法
- 非静态方法内的同步块
- 静态方法内的同步块
{
public class TestSynchronized {
public static void main(String[] args) {
NumberSpeaker numberSpeaker1 = new NumberSpeaker("numberSpeaker1");
NumberSpeaker numberSpeaker2 = new NumberSpeaker("numberSpeaker2");
Thread thread1 = new NumberSpeakerThread(numberSpeaker1 );
Thread thread2 = new NumberSpeakerThread(numberSpeaker2 );
thread1.start();
thread2.start();
}
}
class NumberSpeaker{
public String speakerName ;
public NumberSpeaker(String speakerName ) {
this.speakerName = speakerName ;
}
public synchronized void speak(int number) {
for(int i = 0; i < number ; i ++) {
try {
Thread.sleep(500);
} catch (InterruptedException e ) {
e.printStackTrace();
}
System. out.println(this .speakerName + " speaking: " + i );
}
}
}
class NumberSpeakerThread extends Thread {
private NumberSpeaker numberSpeaker = null;
public NumberSpeakerThread(NumberSpeaker numberSpeaker ) {
this.numberSpeaker = numberSpeaker ;
}
@Override
public void run() {
this.numberSpeaker.speak(10);
}
}
// 改为numberSpeaker1
// 把synchronized关键字去掉
// 改为numberSpeaker1
// 把synchronized关键字加上
// 改为numberSpeaker2
// 把synchronized关键字加上
{
Class().add)都会产生锁竞争的情况。
{
{
public class TestSynchronized {
public static void main(String[] args) {
String str1 = "numberSpeaker1";
String str2 = "numberSpeaker2" ;
NumberSpeaker numberSpeaker1 = new NumberSpeaker(str1);
NumberSpeaker numberSpeaker2 = new NumberSpeaker(str2);
Thread thread1 = new NumberSpeakerThread(numberSpeaker1 );
Thread thread2 = new NumberSpeakerThread(numberSpeaker2 );
thread1.start();
thread2.start();
}
}
class NumberSpeaker {
public String speakerName ;
public NumberSpeaker(String speakerName ) {
this.speakerName = speakerName ;
}
public void speak(int number) {
synchronized (speakerName ) {
for (int i = 0; i < number ; i ++) {
try {
Thread. sleep(500);
} catch (InterruptedException e ) {
e.printStackTrace();
}
System. out.println(speakerName + " speaking: " + i );
}
}
}
}
class NumberSpeakerThread extends Thread {
private NumberSpeaker numberSpeaker = null;
public NumberSpeakerThread(NumberSpeaker numberSpeaker ) {
this.numberSpeaker = numberSpeaker ;
}
@Override
public void run() {
this.numberSpeaker .speak(10);
}
}
{
{
String msg2) {
String msg2) {
{
- Contention List:所有请求锁的线程将被首先放置到该竞争队列。
- Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List。
- Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set。
- OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck。
- Owner:获得锁的线程称为Owner。
- !Owner:释放锁的线程。
JVM锁机制之synchronized的更多相关文章
- [转帖]B4. Concurrent JVM 锁机制(synchronized)
B4. Concurrent JVM 锁机制(synchronized) https://www.cnblogs.com/zlxyt/p/11050346.html 挺好的 感觉这个文章写的 不过想要 ...
- B4. Concurrent JVM 锁机制(synchronized)
[概述] JVM 通过 synchronized 关键字提供锁,用于在线程同步中保证线程安全. [synchronized 实现原理] synchronized 可以用于代码块或者方法中,产生同步代码 ...
- 转:synchronized和LOCK的实现原理---深入JVM锁机制
JVM底层又是如何实现synchronized的? 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug ...
- [转载]深入JVM锁机制-synchronized
转自:http://blog.csdn.net/chen77716/article/details/6618779,并加上少量自己的理解 目前在Java中存在两种锁机制:synchronized和Lo ...
- java多线程之:深入JVM锁机制2-Lock (转载)
前文(深入JVM锁机制-synchronized)分析了JVM中的synchronized实现,本文继续分析JVM中的另一种锁Lock的实现.与synchronized不同的是,Lock完全用Java ...
- 深入JVM锁机制2-Lock
前文(深入JVM锁机制-synchronized)分析了JVM中的synchronized实现,本文继续分析JVM中的另一种锁Lock的实现.与synchronized不同的是,Lock完全用Java ...
- 深入JVM锁机制1-synchronized
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Loc ...
- 并发编程的锁机制:synchronized和lock
1. 锁的种类 锁的种类有很多,包括:自旋锁.自旋锁的其他种类.阻塞锁.可重入锁.读写锁.互斥锁.悲观锁.乐观锁.公平锁.可重入锁等等,其余就不列出了.我们重点看如下几种:可重入锁.读写锁.可中断锁. ...
- 【Java线程】锁机制:synchronized、Lock、Condition
http://www.infoq.com/cn/articles/java-memory-model-5 深入理解Java内存模型(五)——锁 http://www.ibm.com/develope ...
随机推荐
- Ubuntu Docker 安装和配置 GitLab CI 持续集成
相关文章: Ubuntu Docker 简单安装 GitLab 劈荆斩棘:Gitlab 部署 CI 持续集成 目的:在 Ubuntu 服务器上,使用 Docker 安装和配置 GitLab Runne ...
- 进程管理之wait和waitpid
僵尸进程 在介绍wait.waitpid和waitid函数之前,首先要介绍一下僵尸进程,因为,这三个函数的本质任务就是处理僵尸进程的问题. 进程会我们的生命体一样,也有消亡.进程在退出时,内核会清理进 ...
- jQuery DOM对象区别与联系
对两种对象类型的定义,只要能理解并转换成自己的说法就可以,不用死板按照资料所写 jQuery对象(jq对象)其实就是通过jquery类库选择器获得的对象(或者说是通过$获取的对象或者说是通过jquer ...
- SpringMVC(一)--基础、REST、@RequestParam、POST请求乱码等
1.SpringMVC基本概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 ...
- PYQT4 : QSystemTrayIcon练习
照着demo自己做了一遍,练练手 import sys from PyQt4 import QtGui from PyQt4 import QtCore class SysTray(QtGui.QDi ...
- Spark Structured Streaming框架(2)之数据输入源详解
Spark Structured Streaming目前的2.1.0版本只支持输入源:File.kafka和socket. 1. Socket Socket方式是最简单的数据输入源,如Quick ex ...
- ie启动不了的解决办法,win7,win8都可以
今天我的IE也无法打开了,我装的是win7的系统,ie升级到了IE11,无法打开了,看到下面这篇文章,借鉴试试,没想到也成功了. 按以上步骤,打开注册表, 第一步.按下Win+R组合键,在出现的运行命 ...
- postman 第4节 切换环境和设置读取变量(转)
postman提供了environment管理功能,想要在多个环境中测试,比如在测试环境.灰度环境.生产环境等,只需要用同样的接口,切换下环境即可,非常方便.具体步骤: 切换环境 1.点击界面右上角的 ...
- 09 Linear Regression
线性回归假设 错误衡量/代价函数---均方误差 最小化样本内代价函数 只有满秩方阵才有逆矩阵 线性回归算法 线性回归算法是隐式迭代的 线性回归算法泛化可能的保证 线性分类是近似求解,线性回归是解析求解 ...
- 关于javascript原型链的个人理解
首先js是一种面对对象的语言,虽然大多数时候是以面对过程的形式展现出来.先来看一段代码: function Base() { this.name = 'tarol'; } function Sub() ...