为了保证数据的一致性即实现线程的安全性,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. sublime text 3插件改造之添加从模版新增文件到指定目录

    简介:以前使用ST2里面的Sublime NFFT插件比较顺手,最近安装了ST3,但是Sublime NFFT插件不支持ST3,就下载了SublimeTmpl从模版新建文件插件.在使用时,习惯在侧边栏 ...

  2. QQ for Mac聊天纪录怎么查找??

    在你Mac上打开你的QQ,选择任意聊天窗口,打字的上面有6个图表快捷键,第6个就是查看聊天记录的功能键

  3. 前端如何搭建vue UI组件库/封装插件(从零到有)

    需求 因之前是做外包项目居多,经常用到相同的组件,之前的办法是在一个项目中写一个组件,其他项目直接将compents下的组件复制,粘贴到项目中使用,缺点是维护起来,改一个项目,其他项目也需要修改,所以 ...

  4. bookdown - 撰写和发表自己的网络书籍/文档

    BOOKDOWN官网 - bookdown上有不少人发布了自己的电子书 bookdown-demo (一个demo,github源码)- Rstudio出品,Yihui Xie开发,著名单细胞课程在用 ...

  5. 详解python3如何调用c语言代码

    本文链接:https://blog.csdn.net/u012247418/article/details/80170690开发环境linux: python3.5.2 + ubuntu-gnome- ...

  6. (九)Knockout 进一步技术

    加载和保存 JSON 数据 Knockout允许您实现复杂的客户端交互,但是几乎所有web应用程序还需要与服务器交换数据,或者至少要序列化数据以供本地存储.交换或存储数据最方便的方式是JSON格式-- ...

  7. ISO/IEC 9899:2011 引言

    引言 1.伴随着新的设备以及扩展字符集的引入,可能会将新的特性添加到此国际标准中.在此语言和库条款中的子条款提醒了实现者与程序员可能会与将来所新增特性产生冲突的用法,尽管它们现在本身是合法有效的. 2 ...

  8. 决策树分析、EMV(期望货币值)

    名称:决策树分析.EMV(期望货币值) 定义:它利用了概率论的原理,并且利用一种树形图作为分析工具.其基本原理是用决策点代表决策问题,用方案分枝代表可供选择的方案,用概率分枝代表方案可能出现的各种结果 ...

  9. ROS tf-深入Time和TF

    博客转载自:https://www.ncnynl.com/archives/201702/1313.html ROS与C++入门教程-tf-深入Time和TF 说明: 介绍使用waitForTrans ...

  10. Robotics Education and Research at Scale - A Remotely Accessible Robotics Development Platform

    张宁  Robotics Education and Research at Scale - A Remotely Accessible Robotics Development Platform链接 ...