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 ...
随机推荐
- java多线程基础(synchronize关键字)
[toc] 基础知识 ---- 线程:进程(process)就是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元. 线程:进程中所包含的一个或多个执行单元称为线程(threa ...
- 转载:细说Cookie
细说Cookie 转载:http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html 阅读目录 开始 Cookie 概述 Cookie的 ...
- fiddler mock ==> AutoResponder
背景 做过测试的同学,肯定都听过fiddler的大名,抓包工具,app抓包 下载传送门(https://www.telerik.com/download/fiddler) 抓包使用这里就不复述了,这次 ...
- 关于Eclipse启动报错,jvm版本不匹配的问题
前几天重新下了个eclipse,eclipse需要java环境才能运行起来,我当时电脑上自己装了jdk1.8,然后直接运行新下载的eclipse,说我的jvm版本是1.6,但是我不记得安装过1.6的了 ...
- python+selenium自动化软件测试(第11章):持续集成jenkins和GitHub的使用
11.1 jenkins持续集成环境 相关安装包下载链接:http://pan.baidu.com/s/1qYhmlg4 密码:dcw2赠送jenkins集成selenium环境视频链接http:// ...
- SSH:dataSource配置问题
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- [2016-09-23]远程安装、更新windows服务bat脚本分享
话不多说,有兴趣的自己可以仔细研究下涉及的命令:net use.sc.robocopy 脚本 set BuildConfig=[ENV] set BuildExeName=[your_exe_name ...
- macaca测试web小例子
上午刚把macaca的环境在公司的电脑上吧web 端的环境给搭建好,于是乎,看看网上的例子,看看官方的文档 https://macacajs.github.io/wd.py/ 可以在这个链接看到原滋原 ...
- java TreeSet 应用
本文主要是介绍一下java集合中的比较重要的Set接口下的可实现类TreeSet TreeSet类,底层用二叉树的数据结构 * 集合中以有序的方式插入和抽取元素. * 添加到TreeSet中的元素必须 ...
- Javascript的内容摘要
JS简介和变量 {JS的三种方式} 1 HTML中内嵌JS(不提倡使用) <button onclick="javascript:alert ...