为了保证数据的一致性即实现线程的安全性,java虚拟机提供了同步和锁机制。synchronized关键字是最基本的互斥同步手段。除此之外,还可以使用java.util.concurrent包中的重入锁(ReentrantLock)来实现同步。相比synchronized,ReentrantLock增加了一些高级功能,主要有等待可中断、可实现公平锁、锁可以绑定多个条件等。

见SynchronizedDemo.java的源码理解synchronized

/**
* Synchronized理解:
* 根据如下4个例子总结如下:
* Synchronized修饰的方法和Synchronized(this)修饰的代码块功能是一样的,当使用Synchronized修饰的方法或Synchronized(this)修饰的代码块被调用时,当前的实例对象被锁住,因此没有其他线程可以调用该实例对象的这个或任何其他的Synchronized修饰的方法和Synchronized(this)修饰的代码块
* static Synchronized修饰的方法和Synchronized(*.class)修饰的代码块功能是一样的,当使用static Synchronized修饰的方法或Synchronized(*.class)修饰的代码块被调用时,当前的类对象(例子中的是Sync.class对象)被锁住,因此没有其他线程可以调用同一个类的的这个或任何其他的static Synchronized修饰的方法和Synchronized(*.class)修饰的代码块
**/
public class SynchronizedDemo{
/**
* 例1:
* 同一个对象:
* 当一个线程进入一个对象A的synchronized方法的同时,其它线程不能进入该对象的任何synchronized方法
**/
private void showSynchronizedResult1(){
final Sync testSync1 = new Sync(); Thread thread1 = new Thread(new Runnable(){
@Override
public void run(){
testSync1.run1();
}
}); Thread thread2 = new Thread(new Runnable(){
@Override
public void run(){
testSync1.run2();
}
}); thread1.start();
thread2.start();
} /**
* 例2:
* 同一个对象:
* 当一个线程进入一个对象A的synchronized方法的同时,其它线程可以进入该对象的普通方法
**/
private void showSynchronizedResult2(){
final Sync testSync1 = new Sync(); Thread thread1 = new Thread(new Runnable(){
@Override
public void run(){
testSync1.run1();
}
}); Thread thread3 = new Thread(new Runnable(){
@Override
public void run(){
testSync1.run3();
}
}); thread1.start();
thread3.start();
} /**
* 例3:
* 不同对象
* 当一个线程进入一个对象A的synchronized方法的同时,其它线程可以进入其他对象的synchronized方法,互不影响
**/
private void showSynchronizedResult3(){
final Sync testSync1 = new Sync();
final Sync testSync2 = new Sync(); Thread thread1 = new Thread(new Runnable(){
@Override
public void run(){
testSync1.run1();
}
}); Thread thread2 = new Thread(new Runnable(){
@Override
public void run(){
testSync2.run2();
}
}); thread1.start();
thread2.start();
} /**
* 例4:
* 当一个线程进入一个static synchronized方法的同时,其它线程不可以进入任何的static synchronized方法
**/
private void showStaticSynchronizedResult4(){
Thread thread1 = new Thread(new Runnable(){
@Override
public void run(){
Sync.run4();
}
}); Thread thread2 = new Thread(new Runnable(){
@Override
public void run(){
Sync.run5();
}
}); thread1.start();
thread2.start();
} public static void main(String args[]){
// 例1:多线程下同一对象的多个Synchronized方法
new SynchronizedDemo().showSynchronizedResult1(); // 例2:多线程下同一对象的Synchronized方法和普通方法
//new SynchronizedDemo().showSynchronizedResult2(); // 例3:多线程下不同对象的Synchronized方法
//new SynchronizedDemo().showSynchronizedResult3(); // 例4:多线程下的多个static Synchronized方法
//new SynchronizedDemo().showStaticSynchronizedResult4();
}
} class Sync{
public synchronized void run1(){
for (int i = 0; i < 5; i++){
System.out.println("execute run1");
sleepOneSec();
}
} public synchronized void run2(){
for (int i = 0; i < 5; i++){
System.out.println("execute run2");
sleepOneSec();
}
} public void run3(){
for (int i = 0; i < 5; i++){
System.out.println("execute run3");
sleepOneSec();
}
} public static synchronized void run4(){
for (int i = 0; i < 5; i++){
System.out.println("execute run4");
sleepOneSec();
}
} public static synchronized void run5(){
for (int i = 0; i < 5; i++){
System.out.println("execute run5");
sleepOneSec();
}
} private static void sleepOneSec(){
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}

java之结合代码理解synchronized关键字的更多相关文章

  1. Java精通并发-透过字节码理解synchronized关键字

    在上一次https://www.cnblogs.com/webor2006/p/11428408.html中对于synchronized关键字的作用做了一个实例详解,下面再来看一下这个程序: 请问下, ...

  2. Java多线程(四)—— synchronized关键字续

    1.synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,sy ...

  3. 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  4. Java多线程(三)—— synchronized关键字详解

    一.多线程的同步 1.为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源.必须对这种潜在资源冲突进行预防. 解决方法:在线程使用一个资源时为其加锁即可. 访问资 ...

  5. Java 多线程(六) synchronized关键字详解

    多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...

  6. Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】

    自旋对于synchronized关键字的底层意义与价值分析: 对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述 ...

  7. Java 多线程并发编程之 Synchronized 关键字

    synchronized 关键字解析 同步锁依赖于对象,每个对象都有一个同步锁. 现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的 ...

  8. java 多线程:线程安全问题synchronized关键字解决

    背景: 多个线程同时修改一个变量时,有概率导致两次修改其中某些次被覆盖. 例如:如下案例一个变量值为3,三个线程同时对其-1,如果按顺序执行,每次减完的结果应该是2,1,0.但实际运行中有可能变为0, ...

  9. java基础篇之理解synchronized的用法

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

随机推荐

  1. linux修改固定IP

    点击虚拟机菜单栏的编辑,选择虚拟网络编辑器 选择Vmnet8 NAT模式,查看子网ip:192.168.233.0 我们的虚拟机网络模式也需要选择NAT模式 打开虚拟机,输入:ip addr 查看当前 ...

  2. D3.js的v5版本入门教程(第四章)—— 理解Update、Enter、Exit

    D3.js的v5版本入门教程(第四章) Update.Enter.Exit是D3.js中很重要的概念,下面来讲一下它们到底是什么?(当你看完后.你就会知道如果数据集个数和选择集个数不匹配的情况下使用d ...

  3. 解决MySql ERROR 1698 (28000) 错误:Access denied for user 'root'@'localhost'

    今天尝试在Ubuntu虚拟机上安装MySql 数据库(版本是:5.7.23-0Ubuntu0.18.04.1),数据库安装很简单,就是三行命令:   sudo apt-get install mysq ...

  4. [C++] namespace命名空间和using用法

    命名空间namespace:指标识符的各种可见范围. C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因. 很 ...

  5. SpringBoot dev-tools vjtools dozer热启动类加载器不相同问题

    最近使用唯品会的vjtools的BeanMapper进行对象的深度克隆转换DTO/VO这种操作,Spring Boot的dev-tools热启动,需要把vjtools和dozer包都放到spring- ...

  6. python 播放MP3和MP4

    import pygame import time def play_music(): filepath = r"900A.mp3"; pygame.mixer.init() # ...

  7. jdbc批量写入

    jdbc加了rewriteBatchedStatements=true就可以提升很多倍,

  8. python去除BOM头\ufeff等特殊字符

    1.\ufeff 字节顺序标记 去掉\ufeff,只需改一下编码就行,把UTF-8编码改成UTF-8-sigwith open(file_path, mode='r', encoding='UTF-8 ...

  9. 迁移Git项目到Gitlab

    假定Gitlab已经安装, 假定要迁移的Git项目目录为 demo 首先在Gitlab里创建一个新的project, 名称为demo (或者其他名称都可以) 然后在现有的Git项目目录下, 进行以下操 ...

  10. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色

    一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...