java之结合代码理解synchronized关键字
为了保证数据的一致性即实现线程的安全性,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关键字的更多相关文章
- Java精通并发-透过字节码理解synchronized关键字
在上一次https://www.cnblogs.com/webor2006/p/11428408.html中对于synchronized关键字的作用做了一个实例详解,下面再来看一下这个程序: 请问下, ...
- Java多线程(四)—— synchronized关键字续
1.synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,sy ...
- 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- Java多线程(三)—— synchronized关键字详解
一.多线程的同步 1.为什么要引入同步机制 在多线程环境中,可能会有两个甚至更多的线程试图同时访问一个有限的资源.必须对这种潜在资源冲突进行预防. 解决方法:在线程使用一个资源时为其加锁即可. 访问资 ...
- Java 多线程(六) synchronized关键字详解
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...
- Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】
自旋对于synchronized关键字的底层意义与价值分析: 对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述 ...
- Java 多线程并发编程之 Synchronized 关键字
synchronized 关键字解析 同步锁依赖于对象,每个对象都有一个同步锁. 现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的 ...
- java 多线程:线程安全问题synchronized关键字解决
背景: 多个线程同时修改一个变量时,有概率导致两次修改其中某些次被覆盖. 例如:如下案例一个变量值为3,三个线程同时对其-1,如果按顺序执行,每次减完的结果应该是2,1,0.但实际运行中有可能变为0, ...
- java基础篇之理解synchronized的用法
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...
随机推荐
- GoCN每日新闻(2019-10-01)
GoCN每日新闻(2019-10-01) GoCN每日新闻(2019-10-01) 1. 我依然爱着 GOPATH https://divan.dev/posts/gopath/ 2. Go 代码注释 ...
- mac百度网盘破解版
以下资源来源于网络收集分享,如有问题请联系我删除!来源入口,后面链接挂了,可去原网址访问! 还在为Mac百度网盘下载速度慢而烦恼吗?百度云盘又是一个非常实用的分享工具,可支持图片.视频.音乐.文档.种 ...
- VS2017 Asp.Net调式闪退处理
- 照片放大功能h5
这里就不放图了,放大的是别人的身份证 <template> <div class="image-cell__wrapper" :style="borde ...
- Koa Session的使用
Session 简单介绍 session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上. Session 的工作流程 当浏览器访问服务器 ...
- 第09组 Beta冲刺(4/4)
队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...
- uniapp - 键盘弹起背景图片不会被挤压
[释义] uni.getSystemInfoSync()获取屏幕可用高度windowScreen做为背景图高度即可(非虚拟DOM也可以使用本思路). [源码] <template> < ...
- CentOS 6和 CentOS 7的区别【转】
虽然,redhat 8在今年已经推出了,但是centos 8还没有推出.而且公司好多都在用centos 6和7 来了解一下6和7的区别吧 整体说明 1.系统 项目CentOS 6CentOS7 . 安 ...
- spring AOP的使用步骤
Spring AOP定义及术语:https://www.cnblogs.com/wangcp-2014/p/11544674.html spring AOP的使用,分三个步骤,记住这三个步骤,AOP就 ...
- Python3基础 tuple list转为tuple
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...