一、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的关键字。

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

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同步快解决同步方法效率低得弊端

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

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

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

public class CommonUtils {public static long beginTime1;public static long endTime1;public static long beginTime2;public static long endTime2;
}

CommonUtils

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

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同步快相关推荐

  1. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  2. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  3. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  4. 【转载】Java多线程编程2--同步锁定--synchronized同步方法、脏读、锁重入

        线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 1.方法内的变量为线程安全   "非线程安全"问题存在于"实例变量"中,如果是方法内 ...

  5. 【Java进阶营】JAVA多线程基础学习二:synchronized

    本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题,没错就是使用synchronized. 一.如何解决线程安全问题? 一般 ...

  6. Java多线程学习十二: synchronized的工作原理 以及背后的“monitor 锁”

    我们研究下 synchronized 背后的 monitor 锁. 获取和释放 monitor 锁的时机 我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个 ...

  7. 耀世升级发布!阿里第三版Java多线程核心技术手册PDF全彩版

    篇将会带着大家去全面剖析多线程编程的核心库.方法.原理,利用案例方式,透彻讲解高并发本质与应对方法!同时这份PDF全部以Demo式案例来讲解技术点的实现,使读者看到代码及 运行结果后就可以知道该项目要 ...

  8. 耀世升级发布,阿里新出第三版Java多线程核心技术手册PDF全彩版

    本篇将会带着大家去全面剖析多线程编程的核心库.方法.原理,利用案例方式,透彻讲解高并发本质与应对方法!同时这份PDF全部以Demo式案例来讲解技术点的实现,使读者看到代码及 运行结果后就可以知道该项目 ...

  9. 耀世升级,第三版Java多线程核心技术手册,成长之路必不可少

    本篇将会带着大家去全面剖析多线程编程的核心库.方法.原理,利用案例方式,透彻讲解高并发本质与应对方法!同时这份PDF全部以Demo式案例来讲解技术点的实现,使读者看到代码及 运行结果后就可以知道该项目 ...

最新文章

  1. h5打开麦克风权限录音_MAC录屏没有声音?如何在苹果电脑MACBOOK上录音录屏
  2. sqlite3 增删更改查询 callback使用
  3. windows tasklist 查看应用、进程
  4. linux系统运维指南 pdf_linux运维:系统监控命令实践
  5. 服务器显示配置命令,linux查看服务器配置命令
  6. 为什么中国没有类似于windows的操作系统?
  7. 小程序获取用户信息 php发送数据库,qq小程序如何获取用户信息并存入数据库实例...
  8. SSH Config Editor Mac(SSH配置编辑器)V2.2
  9. java jco sap 重连_Java连接SAP,使用SAPJCO3.jar
  10. Java实验一:博饼
  11. Android系统关于音量相关的控制-初识
  12. 阿里云对象存储OSS图片上传并回显
  13. STM32_BKP备份数据
  14. 华为的服务器虚拟化软件,服务器虚拟化软件
  15. Heuristic Search之Greedy Best First Search
  16. 腾讯小程序服务器忙,使用腾讯云助手小程序管理腾讯云服务器
  17. WordPress网站加装SSL证书后无法正常加载图片问题
  18. 致命错误: Call to undefined function mb_detect_encoding()
  19. 户外lisp导向牌如何安装_详细图解丨|各类广告标牌的安装方法大全!
  20. 用astash 画UML类图

热门文章

  1. install opencv 4.1.1 from source on windows,在其他项目中用cmake去引用
  2. Hybrid Skeleton Driven Surface Registration for Temporally Consistent Volumetric Video
  3. 基于集成学习的小麦赤霉病高光谱图像识别方法研究
  4. Java实现一个会员制度的CD出租销售店,基本的功能有:一是对会员的管理,包括增加会员、删除会员;二是对货品的管理,包括出租、销售CD、进货、统计账目等。
  5. oracle分区键使用教程,Oracle表分区学习笔记
  6. AI学习笔记(十三)CNN之人脸检测
  7. 京东商品知识图谱,约10万商品品牌,约65万品牌销售关系
  8. python爬虫有道词典_Python爬取有道词典,有道的反爬很难吗?也就这样啊!
  9. html验证用户名长度,JQuery表单字符串长度验证
  10. python queue死锁_Python学习【第24篇】:死锁,递归锁,信号量,Event事件,线程Queue...