1. /**
  2. * @author admin
  3. * @date 2018/1/12 9:48
  4. * 作用在同一个实例对象上讨论
  5. * synchronized同步方法的测试
  6. * 两个线程,一个线程调用synchronized修饰方法,另一个线程可以调用非synchronized修饰的方法,互不影响
  7. */
  8. public class SynchronizedTest {
  9.  
  10. public synchronized void methodA() {
  11. try {
  12. for (int i = 0; i < 5; i++) {
  13. System.out.println("methodA-" + i);
  14. Thread.sleep(1000);
  15. }
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20.  
  21. public void methodB() {
  22. try {
  23. for (int i = 0; i < 5; i++) {
  24. System.out.println("methodB-" + i );
  25. Thread.sleep(1000);
  26. }
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30.  
  31. }
  32.  
  33. public static void main(String[] args) {
  34. SynchronizedTest test = new SynchronizedTest();
  35. Thread thread1 = new Thread(new Runnable() {
  36. @Override
  37. public void run() {
  38. test.methodA();
  39. }
  40. });
  41. thread1.start();
  42.  
  43. Thread thread2 = new Thread(new Runnable() {
  44. @Override
  45. public void run() {
  46. test.methodB();
  47. }
  48. });
  49. thread2.start();
  50. }
  51. }
  52.  
  53. 运行结果:
  54. methodA-0
  55. methodB-0
  56. methodA-1
  57. methodB-1
  58. methodB-2
  59. methodA-2
  60. methodA-3
  61. methodB-3
  62. methodA-4
  63. methodB-4
  1. /**
  2. * @author admin
  3. * @date 2018/1/12 10:16
  4. * 作用在同一个实例对象上讨论
  5. * Sychronized代码块的测试
  6. * 两个线程,一个线程执行synchronized代码块,另一个线程执行非synchronized代码块
  7. */
  8. public class SychronizedTest2 {
  9. public void methodA() {
  10. synchronized (this) {
  11. try {
  12. for (int i = 0; i < 5; i++) {
  13. System.out.println("methodA-" + i);
  14. Thread.sleep(1000);
  15. }
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19.  
  20. }
  21. }
  22.  
  23. public void methodB() {
  24. try {
  25. for (int i = 0; i < 5; i++) {
  26. System.out.println("methodB-" + i);
  27. Thread.sleep(1000);
  28. }
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33.  
  34. public static void main(String[] args) {
  35. SychronizedTest2 test2 = new SychronizedTest2();
  36. Thread thread1 = new Thread(new Runnable() {
  37. @Override
  38. public void run() {
  39. test2.methodA();
  40. }
  41. });
  42. thread1.start();
  43.  
  44. Thread thread2 = new Thread(new Runnable() {
  45. @Override
  46. public void run() {
  47. test2.methodB();
  48. }
  49. });
  50. thread2.start();
  51. }
  52. }
  53.  
  54. 运行结果:
  55. methodA-0
  56. methodB-0
  57. methodA-1
  58. methodB-1
  59. methodA-2
  60. methodB-2
  61. methodB-3
  62. methodA-3
  63. methodA-4
  64. methodB-4
  1. /**
  2. * @author admin
  3. * @date 2018/1/12 10:33
  4. * 作用在同一个实例对象上讨论
  5. * Synchronized同步方法和同步代码块
  6. * 1、synchronized和synchronized(this)二者没区别,都作用在this对象锁上面,所以会同步
  7. * 2、synchronized(obj),这个是作用在obj对象锁上面,和this对象锁不同,所以不会同步
  8. */
  9. public class SynchronizedTest3 {
  10. public synchronized void methodA() {
  11. try {
  12. for (int i = 0; i < 5; i++) {
  13. System.out.println("methodA-" + i);
  14. Thread.sleep(1000);
  15. }
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20.  
  21. public void methodB() {
  22. synchronized (this) {
  23. try {
  24. for (int i = 0; i < 5; i++) {
  25. System.out.println("methodB-" + i);
  26. Thread.sleep(1000);
  27. }
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. }
  31. }
  32. }
  33.  
  34. public void methodC() {
  35. Object obj = new Object();
  36. synchronized (obj) {
  37. try {
  38. for (int i = 0; i < 5; i++) {
  39. System.out.println("methodC-" + i);
  40. Thread.sleep(1000);
  41. }
  42. } catch (InterruptedException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }
  47.  
  48. public static void main(String[] args) {
  49. SynchronizedTest3 test3 = new SynchronizedTest3();
  50. Thread thread1 = new Thread(new Runnable() {
  51. @Override
  52. public void run() {
  53. test3.methodA();
  54. }
  55. });
  56. thread1.start();
  57.  
  58. Thread thread2 = new Thread(new Runnable() {
  59. @Override
  60. public void run() {
  61. test3.methodB();
  62. }
  63. });
  64. thread2.start();
  65.  
  66. Thread thread3 = new Thread(new Runnable() {
  67. @Override
  68. public void run() {
  69. test3.methodC();
  70. }
  71. });
  72. thread3.start();
  73.  
  74. }
  75. }
  76.  
  77. 运行结果:
  78. methodA-0
  79. methodC-0
  80. methodA-1
  81. methodC-1
  82. methodA-2
  83. methodC-2
  84. methodA-3
  85. methodC-3
  86. methodA-4
  87. methodC-4
  88. methodB-0
  89. methodB-1
  90. methodB-2
  91. methodB-3
  92. methodB-4
  1. /**
  2. * @author admin
  3. * @date 2018/1/12 10:48
  4. * 作用在同一个类上讨论,每一个类只有一个类锁
  5. * synchronized类锁
  6. * static synchronized 和 synchronized(SynchronizedTest4.class),都是作用在同一个类锁上,所以会同步
  7. */
  8. public class SynchronizedTest4 {
  9. public synchronized static void methodA() {
  10. try {
  11. for (int i = 0; i < 5; i++) {
  12. System.out.println("methodA-" + i);
  13. Thread.sleep(1000);
  14. }
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. }
  19.  
  20. public void methodB() {
  21. synchronized (SynchronizedTest4.class) {
  22. try {
  23. for (int i = 0; i < 5; i++) {
  24. System.out.println("methodB-" + i);
  25. Thread.sleep(1000);
  26. }
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32.  
  33. public static void main(String[] args) {
  34. SynchronizedTest4 test4 = new SynchronizedTest4();
  35. Thread thread1 = new Thread(new Runnable() {
  36. @Override
  37. public void run() {
  38. test4.methodA();
  39. }
  40. });
  41. thread1.start();
  42.  
  43. Thread thread2 = new Thread(new Runnable() {
  44. @Override
  45. public void run() {
  46. test4.methodB();
  47. }
  48. });
  49. thread2.start();
  50. }
  51. }
  52.  
  53. 运行结果:
  54. methodA-0
  55. methodA-1
  56. methodA-2
  57. methodA-3
  58. methodA-4
  59. methodB-0
  60. methodB-1
  61. methodB-2
  62. methodB-3
  63. methodB-4
  1. /**
  2. * @author admin
  3. * @date 2018/1/12 11:03
  4. * synchronized的对象锁和static synchronized的类锁,是两个不同的锁,所以不会同步
  5. * 两个线程,一个调用对象锁,一个调用类锁
  6. */
  7. public class SynchronizedTest5 {
  8. public synchronized void methodA() {
  9. try {
  10. for (int i = 0; i < 5; i++) {
  11. System.out.println("methodA-" + i);
  12. Thread.sleep(1000);
  13. }
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18.  
  19. public synchronized static void methodB() {
  20. try {
  21. for (int i = 0; i < 5; i++) {
  22. System.out.println("methodB-" + i);
  23. Thread.sleep(1000);
  24. }
  25. } catch (InterruptedException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29.  
  30. public static void main(String[] args) {
  31. SynchronizedTest5 test5 = new SynchronizedTest5();
  32. Thread thread1 = new Thread(new Runnable() {
  33. @Override
  34. public void run() {
  35. test5.methodA();
  36. }
  37. });
  38. thread1.start();
  39.  
  40. Thread thread2 = new Thread(new Runnable() {
  41. @Override
  42. public void run() {
  43. test5.methodB();
  44. }
  45. });
  46. thread2.start();
  47. }
  48. }
  49.  
  50. 运行结果:
  51. methodA-0
  52. methodB-0
  53. methodA-1
  54. methodB-1
  55. methodB-2
  56. methodA-2
  57. methodB-3
  58. methodA-3
  59. methodB-4
  60. methodA-4

java的同步方法和同步代码块,对象锁,类锁区别的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. Java的synchronized的同步代码块和同步方法的区别

    synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不 ...

  3. 对象及变量的并发访问(同步方法、同步代码块、对class进行加锁、线程死锁)&内部类的基本用法

    主要学习多线程的并发访问,也就是使得线程安全. 同步的单词为synchronized,异步的单词为asynchronized 同步主要就是通过锁的方式实现,一种就是隐式锁,另一种是显示锁Lock,本节 ...

  4. java中的synchronized同步代码块和同步方法的区别

    下面这两段代码有什么区别? //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized ...

  5. 牛客网Java刷题知识点之同步方法和同步代码块的区别(用synchronized关键字修饰)

    不多说,直接上干货! 扩展博客 牛客网Java刷题知识点之多线程同步的实现方法有哪些 为何要使用同步?      java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查 ...

  6. java线程基础巩固---同步代码块以及同步方法之间的区别和关系

    在上一次中[http://www.cnblogs.com/webor2006/p/8040369.html]采用同步代码块的方式来实现对线程的同步,如下: 对于同步方法我想都知道,就是将同步关键字声明 ...

  7. Java基础8-多线程;同步代码块

    作业解析 利用白富美接口案例,土豪征婚使用匿名内部类对象实现. interface White{ public void white(); } interface Rich{ public void ...

  8. 深入理解使用synchronized同步方法和同步代码块的区别

    一.代码块和方法之间的区别 首先需要知道代码块和方法有什么区别: 构造器和方法块,构造器可以重载也就是说明在创建对象时可以按照不同的构造器来创建,那么构造器是属于对象,而代码块呢他是给所有的对象初始化 ...

  9. 同步方法、同步代码块、volidate变量的使用

    当多个线程涉及到共享数据的时候,就会设计到线程安全的问题.非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”.发生脏读,就是取到的数据已经被其他的线程改过了. ...

随机推荐

  1. html标题-段落-字符实体-换行

    Html标题标签: <h1>.<h2>.<h3>.<h4>.<h5>.<h6>标签可以在网页上定义6种级别的标题,这6种级别的标 ...

  2. Word2vec的Skip-Gram 系列1

    转自雷锋网的一篇很棒的文章,写的通俗易懂.自己消化学习了.原文地址是 https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html 这次的分享主 ...

  3. JAVA的基本数据类型和类型转换

    一.数据类型 java是一种强类型语言,第一次申明变量必须说明数据类型,第一次变量赋值称为变量的初始化. java数据类型分为基本数据类型和引用数据类型 基本数据类型有4类8种 第一类(有4种)整型: ...

  4. 2、html补充

    今天补充几个html标签 <body>内常用标签 1.<div>和<span> <div></div> : <div>只是一个块 ...

  5. python测试开发django-55.xadmin使用markdown文档编辑器(django-mdeditor)

    前言 markdown是一个非常好的编辑器,用过的都说好,如果搭建一个博客平台的话,需要在后台做文章编辑,可以整合一个markdown的文本编辑器. github上关于django的markdown插 ...

  6. [rtsp]海康IPC监控摄像头远程外网监控配置(DDNS)

        本来这个DDNS服务正是我想要的,但是配置了之后海康提示不再提供这个服务了,以后统一使用萤石云了,看来有必要去学习下萤石开放平台的api,看都提供哪些服务. 海康威视网络摄像机出厂的默认IP地 ...

  7. [转]jQuery中clone和clone(true)的区别

    jquery中clone() 和 clone(true)的区别. jquery复制 DOM的时候,原来还可以连 dom上面绑定的事件一起复制. 原文: https://www.cnblogs.com/ ...

  8. 基于nginx+xxl-job+springboot高可用分布式任务调度系统

    技术.原理讲解: <分布式任务调度平台XXL-JOB--源码解析一:项目介绍> <分布式任务调度平台XXL-JOB--源码解析二:基于docker搭建admin调度中心和execut ...

  9. [转]你可能不知道的五个强大HTML5 API

    一.全屏 // 找到适合浏览器的全屏方法 function launchFullScreen(element) { if(element.requestFullScreen) { element.re ...

  10. linux 设备驱动概述

    linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和 ...