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 ...
随机推荐
- IPV6与IPV4的区别
IPv4协议的地址长度是32位,IPv6协议的地址长度是128位. 1.表示方式 IPv4地址表示为点分十进制格式,32位的地址分成4个8位分组,每个8位以十进制数显式,中间用点号分隔. 而IPv6采 ...
- noip普及组2005 采药
采药 描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:" ...
- java代理理解
转载请注明出处:http://www.cnblogs.com/zhangcaiwang/p/6247755.html 代理是一种类,编译器编译完成之后是以$Proxy开头. 初始化代理的时候需要类加载 ...
- Session的引入以及Cookie的不足
一.为什么引入session > Cookie实际上就是一个头. > 服务器会创建Cookie,并且将Cookie以一个响应头的形式发送给浏览器 > 浏览器收到Cook ...
- Android笔记: ListView基本用法-ArrayAdapter
ListView实现过程: 新建适配器->添加数据源到适配器->视图加载适配器 数据适配器: 把复杂的数据(数组.链表.数据库.集合等)填充在制定的试图界面上. 两种常用数据适配器 Arr ...
- PYQT4 : QSystemTrayIcon练习
照着demo自己做了一遍,练练手 import sys from PyQt4 import QtGui from PyQt4 import QtCore class SysTray(QtGui.QDi ...
- python+selenium自动化软件测试(第15章):基础实战(2)
#coding:utf-8 #for windows/py2.7 from time import sleep from selenium import webdriver browser = web ...
- python 二进制转换
#二进制装换msg = "大家好"msg1 = msg.encode(encoding='utf-8')#转换成二进制print(msg1)msg2 = msg1.decode(' ...
- nvm版本控制以及node.js
nvm node.js版本控制工具 下载 nvm 包 地址:https://github.com/coreybutler/nvm-windows/releases 我们选择第一个:nvm-noinst ...
- autoconf添加gcc调试选项
autoconf生成的编译选项默认是"-g -O2".这个"-g"选项将我迷惑了,以为生成了GDB调试所需的信息,所以也就没有管后面的"-O2“选 ...