Synchronized的作用:

能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果

Synchronized的两个用法:

1)对象锁

包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对 象)

2)类锁:

指Synchronized修饰静态的方法或指定锁为Class对象

  1. 1 public class SynchronizedObjectCodeBlock2 implements Runnable {
  2. 2
  3. 3 static SynchronizedObjectCodeBlock2 intface = new SynchronizedObjectCodeBlock2();
  4. 4 Object lock1 = new Object();
  5. 5 Object lock2 = new Object();
  6. 6
  7. 7 @Override
  8. 8 public void run() {
  9. 9 synchronized (lock1) {
  10. 10 System.out.println("lock1部分。我叫:" + Thread.currentThread().getName());
  11. 11 try {
  12. 12 Thread.sleep(3000);
  13. 13 } catch (InterruptedException e) {
  14. 14 e.printStackTrace();
  15. 15 }
  16. 16 System.out.println(Thread.currentThread().getName() + "lock1部分运行结束!");
  17. 17 }
  18. 18
  19. 19 synchronized (lock2) {
  20. 20 System.out.println("lock2部分。我叫:" + Thread.currentThread().getName());
  21. 21 try {
  22. 22 Thread.sleep(3000);
  23. 23 } catch (InterruptedException e) {
  24. 24 e.printStackTrace();
  25. 25 }
  26. 26 System.out.println(Thread.currentThread().getName() + "lock2部分运行结束!");
  27. 27 }
  28. 28 }
  29. 29
  30. 30 public static void main(String[] args) {
  31. 31 Thread t1 = new Thread(intface);
  32. 32 Thread t2 = new Thread(intface);
  33. 33 t1.start();
  34. 34 t2.start();
  35. 35 while (t1.isAlive() || t2.isAlive()) {
  36. 36
  37. 37 }
  38. 38 System.out.println("finshed");
  39. 39 }
  40. 40 }

同步代码块锁

运行结果:

  1. 1 public class SynchronizedObjectMethod3 implements Runnable {
  2. 2
  3. 3 static SynchronizedObjectMethod3 intface = new SynchronizedObjectMethod3();
  4. 4
  5. 5 @Override
  6. 6 public void run() {
  7. 7 method();
  8. 8 }
  9. 9
  10. 10 public static void main(String[] args) {
  11. 11 Thread t1 = new Thread(intface);
  12. 12 Thread t2 = new Thread(intface);
  13. 13 t1.start();
  14. 14 t2.start();
  15. 15 while (t1.isAlive() || t2.isAlive()) {
  16. 16
  17. 17 }
  18. 18 System.out.println("finshed");
  19. 19 }
  20. 20
  21. 21 public synchronized void method() {
  22. 22 System.out.println("我是对象锁的方法修饰符形式。我叫:"+ Thread.currentThread().getName());
  23. 23 try {
  24. 24 Thread.sleep(3000);
  25. 25 } catch (InterruptedException e) {
  26. 26 e.printStackTrace();
  27. 27 }
  28. 28 System.out.println(Thread.currentThread().getName()+"运行结束");
  29. 29 }
  30. 30 }

方法锁

运行结果:

  1. 1 public class SynchronizedClassStatic4 implements Runnable {
  2. 2
  3. 3 static SynchronizedClassStatic4 intface1 = new SynchronizedClassStatic4();
  4. 4 static SynchronizedClassStatic4 intface2 = new SynchronizedClassStatic4();
  5. 5
  6. 6 @Override
  7. 7 public void run() {
  8. 8 method();
  9. 9 }
  10. 10
  11. 11 public static synchronized void method(){
  12. 12 System.out.println("我是类锁的第一种形式:static形式。我叫:"+ Thread.currentThread().getName());
  13. 13 try {
  14. 14 Thread.sleep(3000);
  15. 15 } catch (InterruptedException e) {
  16. 16 e.printStackTrace();
  17. 17 }
  18. 18 System.out.println(Thread.currentThread().getName()+"运行结束");
  19. 19 }
  20. 20
  21. 21 public static void main(String[] args) {
  22. 22 Thread t1 = new Thread(intface1);
  23. 23 Thread t2 = new Thread(intface2);
  24. 24 t1.start();
  25. 25 t2.start();
  26. 26 while (t1.isAlive() || t2.isAlive()) {
  27. 27
  28. 28 }
  29. 29 System.out.println("finshed");
  30. 30 }
  31. 31 }

类锁的第一种形式:static形式

运行结果:

  1. 1 public class SynchronizedClassClass5 implements Runnable {
  2. 2
  3. 3 static SynchronizedClassClass5 intface1 = new SynchronizedClassClass5();
  4. 4 static SynchronizedClassClass5 intface2 = new SynchronizedClassClass5();
  5. 5
  6. 6 @Override
  7. 7 public void run() {
  8. 8 method();
  9. 9 }
  10. 10
  11. 11 public void method(){
  12. 12 synchronized (SynchronizedClassClass5.class){
  13. 13 System.out.println("我是类锁的第2种形式:synchronized (*.class)形式。我叫:"+ Thread.currentThread().getName());
  14. 14 try {
  15. 15 Thread.sleep(3000);
  16. 16 } catch (InterruptedException e) {
  17. 17 e.printStackTrace();
  18. 18 }
  19. 19 System.out.println(Thread.currentThread().getName()+"运行结束");
  20. 20 }
  21. 21 }
  22. 22
  23. 23 public static void main(String[] args) {
  24. 24 Thread t1 = new Thread(intface1);
  25. 25 Thread t2 = new Thread(intface2);
  26. 26 t1.start();
  27. 27 t2.start();
  28. 28 while (t1.isAlive() || t2.isAlive()) {
  29. 29
  30. 30 }
  31. 31 System.out.println("finshed");
  32. 32 }
  33. 33 }

类锁的第2种形式:synchronized (*.class)形式

运行结果:

多线程Synchronized的两种锁的更多相关文章

  1. WPF多线程UI更新——两种方法

    WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  2. 多线程通信的两种方式? (可重入锁ReentrantLock和Object)

    (一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...

  3. JAVA多线程实现的两种方式

    java多线程实现方式主要有两种:继承Thread类.实现Runnable接口 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了 ...

  4. JavaSE——多线程实现的两种方式

    Thread类: 创建新执行线程有两种方法. 一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例.例如,计算大于某一规定值的质 ...

  5. Java中的ReentrantLock和synchronized两种锁机制的对比

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  6. Java-将多线程停止的两种方法

    线程如何停止呢 stop方法过时了,看起描述发现,有其他解决方案. 线程结束:就是让线程任务代码执行完,run方法结束. run方法怎么结束呢? run方法中通常都定义循环,只要控制住循环就哦了. / ...

  7. SAP Fiori里两种锁机制(lock)的实现

    方法1: ETAG机制 SAP CRM Fiori采用了这种机制. 看一个具体的例子来理解.假设我用用户名Jerry选中了这个ID为3456的Opportunity,点击Edit按钮之后: 会触发一个 ...

  8. day36 joinablequeue、多线程理论、多线程的两种使用方式、守护线程、互斥锁、死锁、递归锁、信号量

    1.joinablequeue队列 joinablequeue与queue一样,也是一种队列,其继承自queue,也有queue中的put 与get 方法,但是在joinablequeue中有自己的 ...

  9. 【Java多线程】两种基本实现框架

    Java多线程学习1——两种基本实现框架 一.前言 当一个Java程序启动的时候,一个线程就立刻启动,改程序通常也被我们称作程序的主线程.其他所有的子线程都是由主线程产生的.主线程是程序开始就执行的, ...

随机推荐

  1. 使用vlookup的模糊匹配和字符串拼接

    1,=IF(ISNA(VLOOKUP("*"&$D2&"*",$A$2:$A$43,1,FALSE))=FALSE,TRUE,FALSE) 2, ...

  2. mybatis-7-缓存

    1. 一级缓存: SqlSession 级别, 默认开启, 并且不能关闭 操作数据库是需要创建 SqlSession 对象, 在对象中有一个 HashMap 用于存储缓存数据, 不同的 SqlSess ...

  3. 全站 HTTPS 就一定安全了吗?

    随着网络技术手段不断地更新迭代,互联网安全对于企业和个人的重要性都越来越高.因此越来越多的服务商都开始偏向为用户提供更安全的在线内容访问. 中间人攻击 为了保障网站内容安全,诞生了不少加密方式.目前应 ...

  4. vue-cli 3.0脚手架创建vue项目

    1. 卸载vue-cli 2.0 npm uninstall -g vue-cli 2. 安装vue-cli 3.0 npm install @vue/cli 3. 创建项目 npm create & ...

  5. [考试总结]noip模拟26

    首先看到这样中二的题目心头一震.... 然而发现又是没有部分分数的一天. 然而正解不会打.... 那还是得要打暴力. 但是这套题目有两个题目只有一个参数. 所以... (滑稽).jpg 然后我就成功用 ...

  6. python开发包之pyecharts

    一.python包国内源网址有: 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/ ...

  7. Python - 浅拷贝的四种实现方式

    浅拷贝详解 https://www.cnblogs.com/poloyy/p/15084277.html 方式一:使用切片 [:] 列表 # 浅拷贝 [:] old_list = [1, 2, [3, ...

  8. 【LeetCode】204.计数质数

    问题描述: 统计所有小于非负整数 n 的质数的数量. 示例: 输入: 10 输出: 4 解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 . 这是一道简单题,但是却并没有那么直 ...

  9. 一文彻底弄懂cookie、session、token

    前言 作为一个JAVA开发,之前有好几次出去面试,面试官都问我,JAVAWeb掌握的怎么样,我当时就不知道怎么回答,Web,日常开发中用的是什么?今天我们来说说JAVAWeb最应该掌握的三个内容. 发 ...

  10. YsoSerial 工具常用Payload分析之Common-Collections2、4(五)

    前言 Common-Collections <= 3.2.1 对应与YsoSerial为CC1.3.5.6.7 ,Commno-collections4.0对应与CC2.4. 这篇文章结束官方原 ...