1、方法内的私有变量,不存在线程安全问题。非线程安全问题存在于实例变量(全局变量)中
2、在方法上加synchronized表示,当第一个线程进入时方法加锁(其他方法无法调用)
3、synchronized取得的锁是对象锁,而不是把一段代码或方法(函数)当作锁,所以哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。
4.1、A线程先持有Object对象的Lock锁,B线程可以以异步的方式调用Object对象中的非synchronized类型的方法。
4.2、A线程先持有Object对象的Lock锁,B线程如果在这时调用Object对象中的synchronized类型的方法则需等待,也就是同步。
5、当使用synchronized时,当一个线程得到一个对象的锁后,该线程再次请求此对象锁时是可以再次得到该对象的锁的。synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以得到锁的。
6、可重入锁特性:自己可以再次获取自己的内部锁。比如有一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的。【synchronized是可重入锁】
7、出现异常的锁,会自动释放该对象锁。
8、synchronized与static synchronized 的区别:
synchronized是对类的当前实例(当前对象)进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。【实例对象进行限制】
static synchronized恰好就是要控制类的所有实例的并发访问,static synchronized是限制多线程中该类的所有实例同时访问jvm中该类所对应的代码块。【类对象进行限制】
pulbic class Something(){  
    public synchronized void isSyncA(){}  
    public synchronized void isSyncB(){}  
    public static synchronized void cSyncA(){}  
    public static synchronized void cSyncB(){}  
}
a. x.isSyncA()与x.isSyncB()   
b. x.isSyncA()与y.isSyncA()  
c. x.cSyncA()与y.cSyncB()  
d. x.isSyncA()与Something.cSyncA()  
上述各组方法被多线程同时访问的情况:
a中都是对实例x进行访问,因此不能同时被访问,会产生阻塞情况
b中访问的是不同的实例,可以同时访问
c中虽然访问的不同实例,但是调用的方法是锁定类对象,所以会产生阻塞
d中可以同时被访问,因为前者使用对象锁,后者使用的是类锁,两者无关

转载于:https://www.cnblogs.com/myna/p/7942053.html

synchronized的一些记录相关推荐

  1. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)

    在多线程应用程序中经常会遇到线程同步的问题.比如:两个线程A.线程B可能会 "同时" 执行同一段代码,或修改同一个变量.而很多时候我们是不希望这样的. 这时候,就需要用到线程同步. ...

  2. 解决数据库报唯一性约束错误的实践

    猿们好,我是honery,今天来给大家唠一唠如何避免数据库报唯一性约束的错误. 一.问题的引出   首先抛出一个问题,如何保证数据库表中的某列的值都不一样呢?相信大家很容易想到给该列加上唯一性约束,这 ...

  3. 【廖雪峰官方网站/Java教程】多线程(1)

    多线程是Java最基本的一种并发模型,本章我们将详细介绍Java多线程编程. 1.多线程基础 1.1.进程 在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的, ...

  4. 计算机笔记--【并发编程①】

    文章目录 并发编程 前言 1.进程与线程 1.1.概述 1.2.对比 2.并行与并发 3.同步与异步 3.1.应用之异步调用 3.2.应用之提高效率 4.Java线程 4.1.创建和运行线程 4.2. ...

  5. JUC笔记-共享模型之管程 (Monitor)

    JUC-共享模型之管程( Monitor) 一.线程安全问题(重点) 1.1 同步 1.2 线程出现问题的根本原因分析 1.3 synchronized 解决方案 1.3.1 同步代码块 1.3.2 ...

  6. 17万字 JUC 看这一篇就够了(一) (精华)

    JUC 今天我们来进入到 Java并发编程 JUC 框架的学习 ,内容比较多,但希望我们都能静下心来,耐心的看完这篇文章 文章目录 JUC 进程 概述 对比 线程 创建线程 Thread Runnab ...

  7. Java 多线程(三):锁(一)

    Java 多线程(三):锁(一) 作者:Grey 原文地址: 博客园:Java 多线程(三):锁(一) CSDN:Java 多线程(三):锁(一) CAS 比较与交换的意思 举个例子,内存有个值是 3 ...

  8. 【手把手带你学Java EE】多线程那些事,你了解了吗?

    [手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...

  9. Spring事件监听流程分析【源码浅析】

    一.简介 Spring早期是通过实现ApplicationListener接口来定义监听事件,在spring4.2的时候开始我们可以通过@EventListener注解来定义监听事件,Applicat ...

最新文章

  1. c++ hashmap入门教程
  2. xargs的简单解析
  3. java使用stream将List转为Map
  4. es6 取数组的第一个和最后一个_JS算法题之每日一题- 17.在排序数组中查找元素的第一个和最后一个位置...
  5. 页式存储管理程序模拟_ADAS/AD开发12 - 数据存储管理
  6. Azure ARM 上传自定义镜像
  7. 大数据背景下的互联网金融应用领域
  8. 10年腾讯技术专家有话对你说
  9. hibernate 实现数据库查询
  10. wxpython网站_wxpython学习笔记
  11. 前端特效 —— 八卦图旋转(纯css)
  12. Django文档4.0(通俗易懂)
  13. python分类器分5类_Python机器学习之K近邻分类器
  14. Zimbra部署https证书的操作方法
  15. android课程设计致谢,有关课程设计论文的致谢词
  16. 复盘2018,展望2019(上)
  17. Mysql的timestamp(时间戳)详解以及2038问题的解决方案
  18. LeetCode——第121题:买股票的最佳时机
  19. [C# 网络编程系列]专题五:TCP编程
  20. 云南省行政村谷歌图层_如何根据行政边界(省市区县乡镇)下载地图

热门文章

  1. 应用名称本地化/国际化
  2. verilog中级别到底是什么?级别的分类是什么???
  3. solaris 10 安装Apache Mysql PHP
  4. 【性能优化】之 BITMAP 及分区表 的演示
  5. remotepath != null 与 !TextUtils.isEmpty(remotepath) 的区别
  6. Android Studio 解决The SDK platform-tools is too old问题
  7. Android 实现ListView圆角效果
  8. Unity 2018.3.1 SyncVar没有同步服务器变量
  9. Flutter 中的Error的捕获及处理
  10. Python基础学习----参数和返回值