为了保证数据的一致性即实现线程的安全性,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. Noip2019暑期训练1

    题目名称 时空定位 棋子移动 高精度乘法 数独游戏 存盘文件名 location piece mul sudoku 输入文件名 location.in piece.in mul.in sudoku.i ...

  2. 排序---希尔排序Java

    希尔排序 插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减 ...

  3. Tcl条件语句

    If {条件表达式1} { 执行语句1 } elseif {条件表达式2} { 执行语句2 } elseif {条件表达式3} { 执行语句3 } else { 执行语句4 } 注:elseif {条 ...

  4. 第09组 Alpha冲刺(4/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  5. fxjwind Calcite分析 - Volcano模型

    参考,https://matt33.com/2019/03/17/apache-calcite-planner/ Volcano模型使用,分为下面几个步骤, //1. 初始化 VolcanoPlann ...

  6. IDEA2019.2.1中文乱码解决

    写在前面 太晚了, 长话短说, idea更新到2019.2.1, 项目任何地方输入中文都是乱码, 修改编码UTF-8依然如此.参考https://blog.csdn.net/chenjk10/arti ...

  7. 源码包的三个参数make-configure-make install解释

    1.configure 这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码: ./configure --prefix= ...

  8. PLSQL查询执行计划

    转: PLSQL查询执行计划 01(转) 2019-05-15 15:15:43 p享自由q 阅读数 365   一般优化途径: 如果能通过修改语句优化,比如查询条件或执行顺序,sql改不了,可以通过 ...

  9. Android 调试桥介绍 (adb)

    Android 调试桥 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信.它可为各种设备操作提供便利,如安装和调试 ...

  10. Python进阶之面向对象

    新式类与旧式类 区别: 在2.2版本之前所有的类都是旧式类,3.x版本已取消旧式类 旧式类一般的写法,不继承任何父类 class Person: def __init__(self, name): s ...