四、java多线程核心技术——synchronized同步方法与synchronized同步快
一、synchronized同步方法
论:“线程安全”与“非线程安全”是多线程的经典问题。synchronized()方法就是解决非线程安全的。
1、方法内的变量为线程安全
public void addI(String username) {try {int num = 0; \\方法内的变量为线程安全if (username.equals("a")) {num = 100;System.out.println("a set over!");Thread.sleep(2000);} else {num = 200;System.out.println("b set over!");}System.out.println(username + " num=" + num);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}}
2、实例变量非线程安全
public class HasSelfPrivateNum {private int num = 0; \\实例变量非线程安全public void addI(String username) {try {if (username.equals("a")) {num = 100;System.out.println("a set over!");Thread.sleep(2000);} else {num = 200;System.out.println("b set over!");}System.out.println(username + " num=" + num);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}}}
解决方法: 方法前加synchronized关键字。
public class HasSelfPrivateNum {private int num = 0;synchronized public void addI(String username) {..............}}
3、多个对象多个锁
HasSelfPrivateNum.java
public class HasSelfPrivateNum {private int num = 0;synchronized public void addI(String username) {try {if (username.equals("a")) {num = 100;System.out.println("a set over!");Thread.sleep(2000);} else {num = 200;System.out.println("b set over!");}System.out.println(username + " num=" + num);} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}}}
ThreadA
public class ThreadA extends Thread {private HasSelfPrivateNum numRef;public ThreadA(HasSelfPrivateNum numRef) {super();this.numRef = numRef;}@Overridepublic void run() {super.run();numRef.addI("a");}}
ThreadB
public class ThreadB extends Thread {private HasSelfPrivateNum numRef;public ThreadB(HasSelfPrivateNum numRef) {super();this.numRef = numRef;}@Overridepublic void run() {super.run();numRef.addI("b");}}
RUN
public class Run {public static void main(String[] args) {HasSelfPrivateNum numRef1 = new HasSelfPrivateNum();HasSelfPrivateNum numRef2 = new HasSelfPrivateNum();ThreadA athread = new ThreadA(numRef1);athread.start();ThreadB bthread = new ThreadB(numRef2);bthread.start();}}
结果:创建了2个业务实例,产生2个锁,所以运行结果是异步的。同步为synchronized 异步:asynchronized
4、synchronized 锁重入
当一个线程得到一个对象锁时,再次请求该对象锁时是可以再次得到该对象的锁的。继承关系也可重入锁。
当一个线程执行发生异常时,其持有的锁会自动释放。
同步不具有继承性。的在子类方法中添加synchronized的关键字。
![](/assets/blank.gif)
![](/assets/blank.gif)
public class HasSelfPrivateNum {synchronized public void service1() {System.out.println("service1");service2();}synchronized public void service2() {System.out.println("service2");service3();}synchronized public void service3() {System.out.println("service3");} }
HasSelfPrivateNum.java
![](/assets/blank.gif)
![](/assets/blank.gif)
public class mYThread extends Thread {@Overridepublic void run() {HasSelfPrivateNum hspn=new HasSelfPrivateNum();hspn.service1(); }public static void main(String[] args) {mYThread mYThread=new mYThread();mYThread.start();} }
mYThread.java
二、synchronized同步快
synchronized同步方法持有锁后,如果长时间不释放,那另一个线程就必须长时间等待。。这种情况下synchronized同步快来解决
使用方法如图:
1、synchronized同步快之间具有同步性,当线程访问object的一个 synchronized(this)同步代码块时,其他线程对同一个object对象中所有其他的
synchronized(this)同步代码块的访问会被阻塞。
2、synchronized(this)同步代码块是锁定当前对象的。
1、synchronized同步快解决同步方法效率低得弊端
![](/assets/blank.gif)
![](/assets/blank.gif)
public class Task {private String getData1;private String getData2;public synchronized void doLongTimeTask() {try {System.out.println("begin task");Thread.sleep(3000);getData1 = "长时间处理任务后从远程返回的值1 threadName="+ Thread.currentThread().getName();getData2 = "长时间处理任务后从远程返回的值2 threadName="+ Thread.currentThread().getName();System.out.println(getData1);System.out.println(getData2);System.out.println("end task");} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}} }
Task
![](/assets/blank.gif)
![](/assets/blank.gif)
public class MyThread1 extends Thread {private Task task;public MyThread1(Task task) {super();this.task = task;}@Overridepublic void run() {super.run();CommonUtils.beginTime1 = System.currentTimeMillis();task.doLongTimeTask();CommonUtils.endTime1 = System.currentTimeMillis();}}
MyThread1
![](/assets/blank.gif)
![](/assets/blank.gif)
public class MyThread2 extends Thread {private Task task;public MyThread2(Task task) {super();this.task = task;}@Overridepublic void run() {super.run();CommonUtils.beginTime2 = System.currentTimeMillis();task.doLongTimeTask();CommonUtils.endTime2 = System.currentTimeMillis();}}
MyThread2
![](/assets/blank.gif)
![](/assets/blank.gif)
public class CommonUtils {public static long beginTime1;public static long endTime1;public static long beginTime2;public static long endTime2; }
CommonUtils
![](/assets/blank.gif)
![](/assets/blank.gif)
public class Run {public static void main(String[] args) {Task task = new Task();MyThread1 thread1 = new MyThread1(task);thread1.start();MyThread2 thread2 = new MyThread2(task);thread2.start();try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}long beginTime = CommonUtils.beginTime1;if (CommonUtils.beginTime2 < CommonUtils.beginTime1) {beginTime = CommonUtils.beginTime2;}long endTime = CommonUtils.endTime1;if (CommonUtils.endTime2 > CommonUtils.endTime1) {endTime = CommonUtils.endTime2;}System.out.println("耗时:" + ((endTime - beginTime) / 1000));} }
Run
修改Task
![](/assets/blank.gif)
![](/assets/blank.gif)
public class Task {private String getData1;private String getData2;public void doLongTimeTask() {try {System.out.println("begin task");Thread.sleep(3000);String privateGetData1 = "长时间处理任务后从远程返回的值1 threadName="+ Thread.currentThread().getName();String privateGetData2 = "长时间处理任务后从远程返回的值2 threadName="+ Thread.currentThread().getName();synchronized (this) {getData1 = privateGetData1;getData2 = privateGetData2;}System.out.println(getData1);System.out.println(getData2);System.out.println("end task");} catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();}} }
View Code
转载于:https://www.cnblogs.com/aGboke/p/6523365.html
四、java多线程核心技术——synchronized同步方法与synchronized同步快相关推荐
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- Java多线程中使用ReentrantLock、synchronized加锁 简单举例
Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- 【转载】Java多线程编程2--同步锁定--synchronized同步方法、脏读、锁重入
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 1.方法内的变量为线程安全 "非线程安全"问题存在于"实例变量"中,如果是方法内 ...
- 【Java进阶营】JAVA多线程基础学习二:synchronized
本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题,没错就是使用synchronized. 一.如何解决线程安全问题? 一般 ...
- Java多线程学习十二: synchronized的工作原理 以及背后的“monitor 锁”
我们研究下 synchronized 背后的 monitor 锁. 获取和释放 monitor 锁的时机 我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个 ...
- 耀世升级发布!阿里第三版Java多线程核心技术手册PDF全彩版
篇将会带着大家去全面剖析多线程编程的核心库.方法.原理,利用案例方式,透彻讲解高并发本质与应对方法!同时这份PDF全部以Demo式案例来讲解技术点的实现,使读者看到代码及 运行结果后就可以知道该项目要 ...
- 耀世升级发布,阿里新出第三版Java多线程核心技术手册PDF全彩版
本篇将会带着大家去全面剖析多线程编程的核心库.方法.原理,利用案例方式,透彻讲解高并发本质与应对方法!同时这份PDF全部以Demo式案例来讲解技术点的实现,使读者看到代码及 运行结果后就可以知道该项目 ...
- 耀世升级,第三版Java多线程核心技术手册,成长之路必不可少
本篇将会带着大家去全面剖析多线程编程的核心库.方法.原理,利用案例方式,透彻讲解高并发本质与应对方法!同时这份PDF全部以Demo式案例来讲解技术点的实现,使读者看到代码及 运行结果后就可以知道该项目 ...
最新文章
- h5打开麦克风权限录音_MAC录屏没有声音?如何在苹果电脑MACBOOK上录音录屏
- sqlite3 增删更改查询 callback使用
- windows tasklist 查看应用、进程
- linux系统运维指南 pdf_linux运维:系统监控命令实践
- 服务器显示配置命令,linux查看服务器配置命令
- 为什么中国没有类似于windows的操作系统?
- 小程序获取用户信息 php发送数据库,qq小程序如何获取用户信息并存入数据库实例...
- SSH Config Editor Mac(SSH配置编辑器)V2.2
- java jco sap 重连_Java连接SAP,使用SAPJCO3.jar
- Java实验一:博饼
- Android系统关于音量相关的控制-初识
- 阿里云对象存储OSS图片上传并回显
- STM32_BKP备份数据
- 华为的服务器虚拟化软件,服务器虚拟化软件
- Heuristic Search之Greedy Best First Search
- 腾讯小程序服务器忙,使用腾讯云助手小程序管理腾讯云服务器
- WordPress网站加装SSL证书后无法正常加载图片问题
- 致命错误: Call to undefined function mb_detect_encoding()
- 户外lisp导向牌如何安装_详细图解丨|各类广告标牌的安装方法大全!
- 用astash 画UML类图
热门文章
- install opencv 4.1.1 from source on windows,在其他项目中用cmake去引用
- Hybrid Skeleton Driven Surface Registration for Temporally Consistent Volumetric Video
- 基于集成学习的小麦赤霉病高光谱图像识别方法研究
- Java实现一个会员制度的CD出租销售店,基本的功能有:一是对会员的管理,包括增加会员、删除会员;二是对货品的管理,包括出租、销售CD、进货、统计账目等。
- oracle分区键使用教程,Oracle表分区学习笔记
- AI学习笔记(十三)CNN之人脸检测
- 京东商品知识图谱,约10万商品品牌,约65万品牌销售关系
- python爬虫有道词典_Python爬取有道词典,有道的反爬很难吗?也就这样啊!
- html验证用户名长度,JQuery表单字符串长度验证
- python queue死锁_Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue...