在多线程的情况下 需要是同一个对象锁
Synchronized(对象锁)
{
需要保证线程安全的代码
}

1.修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码快前要获得 给定对象 的锁。
2.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得 当前实例 的锁
3.修饰静态方法,作用于当前类对象(当前类.class)加锁,进入同步代码前要获得 当前类对象 的锁
修饰代码块
修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得 给定对象 的锁。
public class ThreadCount implements Runnable {
private static Integer count = 100;
private String lock = “lock”;

@Override
public void run() {while (count > 1) {cal();}
}private void cal() {synchronized (this) {try {Thread.sleep(10);} catch (Exception e) {}count--;System.out.println(Thread.currentThread().getName() + "," + count);}}public static void main(String[] args) {ThreadCount threadCount = new ThreadCount();Thread thread1 = new Thread(threadCount);Thread thread2 = new Thread(threadCount);thread1.start();thread2.start();
}

}

修饰实例方法
修饰实例方法,作用于当前实例加锁,进入同步代码前要获得 当前实例的锁
在实例方法上默认加上synchronized 默认使用this锁。
public class ThreadCount implements Runnable {
private static Integer count = 100;
private String lock = “lock”;

@Override
public void run() {while (count > 1) {cal();}
}private synchronized void cal() {try {Thread.sleep(10);} catch (Exception e) {}count--;System.out.println(Thread.currentThread().getName() + "," + count);
}
public static void main(String[] args) {ThreadCount threadCount = new ThreadCount();Thread thread1 = new Thread(threadCount);Thread thread2 = new Thread(threadCount);thread1.start();thread2.start();
}

}

修饰静态方法
修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得 当前类对象的锁
默认使用当前类的类名.class 锁

public class ThreadCount implements Runnable {
private static Integer count = 100;
private static String lock = “lock”;

@Override
public void run() {while (count > 1) {cal();}
}private static void cal() {synchronized (ThreadCount.class) {try {Thread.sleep(10);} catch (Exception e) {}count--;System.out.println(Thread.currentThread().getName() + "," + count);}}public static void main(String[] args) {ThreadCount threadCount1 = new ThreadCount();ThreadCount threadCount2 = new ThreadCount();Thread thread1 = new Thread(threadCount1);Thread thread2 = new Thread(threadCount2);thread1.start();thread2.start();
}

}

synchronized死锁问题
我们如果在使用synchronized 需要注意 synchronized锁嵌套的问题 避免死锁的问题发生。
案例:
public class DeadlockThread implements Runnable {
private int count = 1;
private String lock = “lock”;

@Override
public void run() {while (true) {count++;if (count % 2 == 0) {// 线程1需要获取 lock 在获取 a方法this锁// 线程2需要获取this 锁在 获取B方法lock锁synchronized (lock) {a();}} else {synchronized (this) {b();}}}
}public synchronized void a() {System.out.println(Thread.currentThread().getName() + ",a方法...");
}public void b() {synchronized (lock) {System.out.println(Thread.currentThread().getName() + ",b方法...");}
}public static void main(String[] args) {DeadlockThread deadlockThread = new DeadlockThread();Thread thread1 = new Thread(deadlockThread);Thread thread2 = new Thread(deadlockThread);thread1.start();thread2.start();
}

}

synchronized 死锁诊断工具
D:\path\jdk\jdk8\bin\jconsole.exe

线程1 先获取到自定义对象的lock锁,进入到a方法需要获取this锁
线程2 先获取this锁, 进入到b方法需要自定义对象的lock锁

线程1 线程2 是在同时执行
线程1 线程2
先获取到自定义对象的lock锁 先获取this锁
需要线程2已经持有的this锁 线程1已经持有自定义对象的lock锁

synchronized锁的基本用法相关推荐

  1. 详解synchronized锁的各种用法及注意事项

    1 前言 本文主要通过简单的demo来阐述synchronized锁的各种用法以及使用synchronized锁的相关注意事项,记录下来同时也方便自己记忆. synchronized锁是jvm内置的锁 ...

  2. Java 多线程 —— 死锁与锁的错误用法

    引言 死锁状态的大致情况是:Thread_1在获得A对象的锁后,紧接着去请求B对象的锁 ,Thread_2在获得了B对象的锁后,紧接着又去请求A对象的锁,如下图: 一.模拟一个死锁 public cl ...

  3. 多线程Synchronized锁的使用与线程之间的通讯

    多线程Synchronized锁的使用与线程之间的通讯 一.什么是线程安全问题 二.如何解决线程安全问题 三.synchronized锁的基本用法 1.修饰代码块(this锁) 2.修饰实例方法(th ...

  4. Synchronized的两个用法

    Synchronized的作用: 能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果 Synchronized的两个用法: 1)对象锁 包括方法锁(默认锁对象为this当前实例对 ...

  5. java synchronized 参数_个人对synchronized锁的参数理解,如果有误望指出

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 synchronized有几种用法 给方法加锁也就是在声明方法时加上synchronized关键字,这样同时就只能有一个线程访问该方法 其次就是代码块,s ...

  6. 面试常考:Synchronized 有几种用法?

    我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面.其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法. 1.同步普通方法 这个也是我 ...

  7. synchronized的4种用法

    synchronized的4种用法 1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候 ...

  8. 【Java】Synchronized解析以及多种用法

    1.概述 [Java]Synchronized 有几种用法 [java] 从hotspot底层对象结构理解锁膨胀升级过程 [java]动态高并发时为什么推荐重入锁而不是Synchronized? [j ...

  9. Synchronized锁的使用

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章是关于并发编程中Synchronized锁的用法知识记录,由于篇幅原因,核心原理知识下篇记录. 本篇文章记录的基础知识,适合在学Ja ...

最新文章

  1. Android 计时器 Chronometer
  2. Spring Security源码分析八:Spring Security 退出
  3. jenkins访问页面是那个html,Jenkins自动化代码上线-静态网页篇
  4. linux杂七杂八整理
  5. jzoj2755-[2012东莞市选]树的计数【dp,高精度】
  6. IAR切BANK--BANK说明
  7. Linux学习笔记:安装CentOS与Linux常用命令
  8. express捕获全局异常的三种方法
  9. android用户界面是通过组件,[科技]Android 用户界面---定制组件(Custom Components)(一)...
  10. R语言实战应用精讲50篇(三十一)-R语言实现决策树(附R语言代码)
  11. 地面监视雷达系统的设计与试验
  12. 云网融合个人学习--云网融合典型场景分析【摘抄】
  13. linux转到工作目录,linux工作目录切换命令
  14. COLVERN LM10/3M29电位计春天,宛若初见!
  15. 第13届中国生物特征识别大会即将盛大开幕,中科博宏期待您的到来!
  16. php当下前景怎么样,最适合当下的趋势策略,详细写给你看(7月13日 指数分位点)...
  17. 【STM8】PWM 捕获实战:占空比和频率(TIM2)
  18. 顺序表的基本操作——初始化表
  19. Python开发(基础):列表List
  20. 数据可视化之旅:常用图表对比

热门文章

  1. Leetcode 141.环形链表 (每日一题 20210617)
  2. 子矩阵的最大累加和问题
  3. 机器人达到指定位置方法数
  4. 元学习Meta-Learning
  5. NTU 课程笔记13:线性规划(对偶性)
  6. pandas 知识点补充:绘图plot
  7. Linux疑难杂症解决方案100篇(十九)-什么是TCP协议中的“三次握手,四次挥手”?带你深入探讨下
  8. Hadoop中-put和-copyFromLocal的区别
  9. python 中文乱码问题解决方案
  10. Hessian 原理分析--转