目录

Synchronized 概述

修饰代码块

synchronized this · 对象锁

synchronized  class · 类锁

修饰普通方法 · 对象锁

修饰静态方法 · 类锁


Synchronized 概述

1、编写一个类、方法、代码块时,如果其中的代码可能运行于多线程环境下,那么就要考虑同步的问题.

"线程安全"问题存在于"实例变量"中,如果是方法内部的私有变量,则不存在"线程安全"问题。
如果多个线程共同访问1个对象中的实例变量,则有可能出现"线程安全"问题。

2、Java 中内置了语言级的同步关键字-synchronized,这大大简化了Java 中多线程同步的使用

3、synchronized 是 Java 中的关键字,是一种同步锁,主要用于修饰方法、代码块

4、例如用 Account 实体类表示一个银行账户信息,主程序中生成 100 个子线程,每一个子线程都对此账户存 100 元,然后又取出 100 元,最终账户的余额应该还是 1000 元。如果线程不同步,则运行的结果极可能超出我们的想像,而且是操作的线程越多,错误出现的概率就越大。

注意事项

1)synchronized 可以定义在方法上,但 synchronized 并不属于方法定义的一部分,因此 synchronized 关键字不能被继承。

2)如果父类中的某个方法使用了 synchronized 关键字,即使子类中覆盖了这个方法,子类中的这个方法默认情况下也并不是同步的,必须显式地在子类的方法中加上 synchronized 关键字。

3)接口中的方法不能使用 synchronized 关键字定义

4)构造方法不能使用 synchronized 关键字,但可以使用 synchronized 代码块来进行同步

修饰代码块

1、被 synchronized  修饰的代码块 {} 称为同步代码块,其作用的范围是大括号 {xxx} 中的代码。

synchronized this · 对象锁

1、如下所示:synchronized(this) 是对象锁,作用对象是调用这个代码块的对象,可以同步不同线程中的同一个对象,下面能达到同步的目的。

public class Test {public static void main(String[] args) {MyThread myThread = new MyThread();//同一个对象for (int i = 0; i < 3; i++) {new Thread(myThread).start();//三个线程使用相同的对象}}
}class MyThread implements Runnable {private static int count = 9;@Overridepublic void run() {synchronized (this) {//设置对象锁,对不同线程中的同一任务对象有效try {for (int i = 0; i < 3; i++) {count--;System.out.print(Thread.currentThread().getName() + ":" + (count)+"\t");TimeUnit.MILLISECONDS.sleep(500 + new Random().nextInt(1000));//随机休眠 0.5-1.5秒}} catch (InterruptedException e) {e.printStackTrace();}}}
}

控制台输出如下:

Thread-0:8    Thread-0:7    Thread-0:6    Thread-2:5    Thread-2:4    Thread-2:3    Thread-1:2    Thread-1:1    Thread-1:0

new Thread(new MyThread()).start();//如果上面改成这样,此时三个线程使用不同的对象,synchronized (this)对象锁无法同步
//如果使用线程池的方式也是同理,对象锁只对同一个对象有效public static void main(String[] args) {MyThread myThread = new MyThread();//同一个对象ExecutorService executorService = Executors.newCachedThreadPool();for (int i = 0; i < 3; i++) {executorService.execute(myThread);//多个线程中是同一个对象,对象锁可以同步executorService.execute(new MyThread());//多个线程中已经不是同一个对象,所以对象锁无用}}

synchronized  class · 类锁

1、作用的范围是 synchronized(Class class){xxx} 后面{}括起来的部分,作用的对象是这个类的所有对象——类锁。

2、对不同线程中的所有本类的对象有效

public class Test {public static void main(String[] args) {for (int i = 0; i < 3; i++) {//三个线程使用不同的对象,此时synchronized (this) 对象锁无法同步,必须使用 类锁new Thread(new MyThread()).start();}}
}class MyThread implements Runnable {private static int count = 9;@Overridepublic void run() {synchronized (MyThread.class) {//设置类锁,对本类的所有对象有效try {for (int i = 0; i < 3; i++) {count--;System.out.print(Thread.currentThread().getName() + ":" + (count) + "\t");TimeUnit.MILLISECONDS.sleep(500 + new Random().nextInt(1000));//随机休眠 0.5-1.5秒}} catch (InterruptedException e) {e.printStackTrace();}}}
}

控制台输出如下:

Thread-0:8    Thread-0:7    Thread-0:6    Thread-2:5    Thread-2:4    Thread-2:3    Thread-1:2    Thread-1:1    Thread-1:0

修饰普通方法 · 对象锁

1、这里所说的"普通方法"是指 "非静态方法"

2、被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象,对不同线程中的同一对象有效——对象锁;

3、一个线程访问一个对象的 synchronized(this){xxx} 代码块、或 synchronized 普通方法时,别的线程可以访问该对象的非synchronized 代码块和方法而不受阻塞。

4、一个线程访问一个对象的 synchronized(this){xxx} 代码块、或 synchronized 普通方法时,别的线程不可以访问该对象的其它synchronized 代码块和方法。

    public synchronized void run() {//写法一}//等价于public void run() {synchronized (this) {//写法二}}

5、编码与上面的“synchronized this · 对象锁”完全一样,这里就不重复粘贴。

修饰静态方法 · 类锁

1、作用的是整个静态方法,作用的对象是这个类的所有对象——类锁;

2、静态方法是属于类的而不属于对象的,同样 synchronized 修饰的静态方法锁定的是这个类的所有对象。

public class Test {public synchronized static void todo() {//写法一}//等价于public void info() {synchronized (Test.class) {//写法二}}
}

3、静态方法随着类的加载而加载,所以对象锁升级为类锁,同一时刻只能有一个线程的对象能访问。

4、编码与上面的 “synchronized  Class · 类锁” 完全一样,这里不再累述。

synchronized 线程同步,添加对象锁与类锁相关推荐

  1. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  2. java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)

    本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁和类锁.特别的是希望能帮大家理清一些概念. 一.synchronized关键字 synchronized关键字有如下两种 ...

  3. java线程同步——条件对象+synchronized 关键字

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...

  4. java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  5. Java对象锁和类锁全面解析(多线程synchronized关键字)

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  6. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  7. Java锁Synchronized对象锁和类锁区别(搬运)

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  8. 透彻理解 Java synchronized 对象锁和类锁的区别

    synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁.这两者的区别我用代码来演示下: 对象锁和类锁是不同的锁, ...

  9. Java 对象锁和类锁 死锁(多线程synchronized关键字)

    本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁 和 类锁. 对于同步,要时刻清醒在 哪个锁对象 上同步,这是关键. 对于同步代码块,要看清楚什么对象已经用于锁定(sy ...

  10. synchronized 对象锁和类锁的区别

    synchronized 对象锁和类锁的区别 synchronized 描述 一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限, 在Java里边就是拿到某个同步对象的 ...

最新文章

  1. java collections_【Java视频教程】day31-集合练习??
  2. 【AMAD】splinter -- 用于测试web app的python框架
  3. HTML5 本地存储(Web Storage)
  4. Java面试之JVM参数调优
  5. javascript document cookie
  6. Cocoa异常编程 NSException
  7. python加入小学课本_Python走进小学教材
  8. 十六、Oracle学习笔记:索引和约束(表字段快速查询和约束)
  9. 如何把手机变成你的救生设备
  10. SQL分组统计-每个学科前三名
  11. js数组常用方法复习
  12. PD4ML将HTML文件转换成PDF文件
  13. Silverlight 2教程(四):Chiron.exe:Silverlight 2打包和动态语言部署工具
  14. 基于JAVA汽车租赁系统 (Springboot框架) 开题报告
  15. Kvaser Memorator Pro 2xHS v2
  16. cad弱电走线图_图解,教你看懂建筑弱电CAD图纸
  17. capybara1-capybara简介
  18. Python手记:global 和 nonlocal的区别
  19. jetson用什么编译器_Jetson ARM SeetaFace编译
  20. 某程序员求助:简历上美化过往经历,把外包写成正编,入职会不会被发现?

热门文章

  1. Bag-of-words模型
  2. mysql identity_insert_由MYSQL SET IDENTITY_INSERT tablename ON;准确方法
  3. 小新pro13睡眠后无法唤醒_电脑休眠后,就无法唤醒了?怎么办?快速教你解决这个问题...
  4. explain ref_explain的属性详解与提速百倍的优化示例
  5. 拓端tecdat|数据分析促进白血病预测诊断
  6. 计算机网络-扩展路由器网段
  7. 将MinimalLinux安装在U盘中
  8. (3)机器学习_逻辑模型_决策树
  9. python绘制混淆矩阵
  10. 总结 | 四篇图网络综述文章提出的Future Directions