首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考虑使用mutex,创建类似于c++整个服务全局锁,或者创建一个全局单例类,在其内定义全局锁。比如以下的代码片段定义线程同步无任何意义:

public class Test1 implements Runnable {
    public void run() {

synchronized(this) {

try {

System.out.println(System.currentTimeMillis());

Thread.sleep(2000);

System.out.println(System.currentTimeMillis());

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}
    public static void main(String[] args) {

for(int i=0;i<10;i++) {

new Thread(new Test1()).start(); // 关键,如果将 new Test1拿到外面,那么同步方法才有意义,如下:

//public static void main(String[] args) {

//    Test1 test=new Test1();

//    for(int i=0;i<10;i++) {

//        new Thread(test).start();

}     } }

因为java或者C#中的线程同步与多线程的概念,只是在单个对象下 这一范围内的,也就是说:单个对象下的 多线程同步 或者 死锁。如果有下面的需求:

1,该类只允许在同一时刻实例化(new)一次;----考虑单例模式

2,或者只允许在同一时刻仅可存活一个对于数据库的修改 或 删除操作;--考虑单例模式 或者 数据库内的事务锁概念。

-----------------------------------------------------

下面我们着重介绍java中的 Sychronized的用法,具体为:同步方法 与 同步块

synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。

  1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:

  public synchronized void accessVal(int newVal);

  synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。

  在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。

  synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。

  2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:

  synchronized(syncObject) {

  //允许访问控制的代码

  }

   synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

  对synchronized(this)的一些理解

  一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

  二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

  三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

  四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

  五、以上规则对其它对象锁同样适用

------------------------------------------------------------------------

网上还有很多关于java中的Sychronized的个人理解与总结,可以忘记的时候看看,但是上面的东东是核心,切记。

此外最关键的,线程同步会耗费很多性能,所以如无必要,尽量少用线程同步,如果使用最好使用同步块而不要使用同步方法。

[转]关于java中的 sychronized 同步方法 与 同步块的理解相关推荐

  1. Java线程同步学习,线程不安全案例讲解,同步方法和同步块 synchronized

    本文主要是自己学习多线程时,所做的笔记,参考的是b站狂神说Java多线程视频讲解. 目录如下: 文章目录 线程同步 一.三大线程不安全案例 1.买票案例 2.不安全取钱 3.线程不安全 二.同步方法及 ...

  2. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块的加载顺序

    1. java中静态变量,静态代码块,静态方法,实例变量,匿名代码块 在Java中,使用{}括起来的代码称为代码块,代码块可以分为以下四种: (1)普通代码块:就是类中方法的方法体 public vo ...

  3. 对Java中常见的四种I/O模型理解

    对Java中常见的四种I/O模型理解 1.1 知识科普 1.1.1 同步阻塞I/O(Blocking I/O) 1.1.1.1 阻塞与非阻塞 1.1.1.2 同步与异步 1.1.1.3 同步阻塞I/O ...

  4. java同步方法同步块_java使用同步方法和同步块的区别

    一.概述有谁能举例说明同步方法优于同步块的优势吗? 二.详解 在块上使用同步方法没有明显的优势. 也许唯一的一个(但我不会称其为优势)是您不需要包括对象引用this. 方法: public synch ...

  5. 【Java线程安全】 synchronized同步方法、同步块:模拟抢票、模拟取款

    synchronized的使用 大佬之所以叫大佬,就是因为他们即使一次看不懂,看二十遍也要看懂,再对萌新说:这个方法不是挺简单的嘛 1.同步方法 要注意的是,synchronized锁的不是方法,而是 ...

  6. java中demo接人_return的用法_如何理解java中return的用法?

    C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...

  7. [转载] Java中静态成员变量,静态代码块,静态内部类何时被初始化?

    参考链接: Java中的初始化程序块Initializer Block 关于这个问题,本文不扯理论,直接上代码,通过结果来验证结论,废话少说,测试代码如下: public class StaticTe ...

  8. (四)Java中的多线程之间实现同步+多线程并发同步

    一.什么是线程安全问题 为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作时不会发生数据冲突问题. ...

  9. java中关于线程的状态属性_深入理解Java多线程与并发框(第①篇)——线程的状态...

    ![](http://img.blog.itpub.net/blog/2020/03/20/5d189a73e1147f37.png?x-oss-process=style/bb) **1. 新建状态 ...

最新文章

  1. 解决 Error:No suitable device found: no device found for connection quot;System eth0quot;
  2. 第二周 第七节 列表的使用
  3. 职场人必备的几个PPT进阶小技巧
  4. 漂亮的页面过渡动画源码
  5. 在不如意的世界里全力以赴_我如何在“外展之旅”中全力以赴
  6. 收藏 | 如何定义目标检测网络的正负例:Anchor-based
  7. 玩游戏计算机丢失msvcp,Win10系统玩吃鸡提示游戏缺少msvcp140.dll的解决方法
  8. JS学习笔记 - 面向对象 - 原型
  9. uuid会重复吗_记一次订单号重复的事故,快看看你的 UUID 在并发下还正确吗?...
  10. java蓝桥杯发现环,第八届蓝桥杯C/C++程序设计本科B组决赛 ——发现环(编程大题_签到题_tarjan判环)...
  11. 基于情感词典的文本情感分析(附代码)
  12. Java程序设计(基础)- 概述
  13. SEO前端篇(二)关键词
  14. 微软笔试题三道(略微偏向竞赛题)
  15. 大话谈VUE之export const
  16. 在星巴克聊聊“一找小七”
  17. 不谈五险一金,难道要和你谈情怀吗?
  18. 荔枝文案,水果荔枝发朋友圈文案
  19. 软件测试工作中需要的Linux知识,一篇文章就够了
  20. 超详细KNIME二次开发的环境配置安装过程

热门文章

  1. navicate连接mysql问题(#1130 - Host 'localhost' is not allowed to connect to this MySQL server)
  2. “页面制作人员”?“页面工程师”?“页面架构师”?滚一边去!
  3. “机密蔓延”成软件供应链安全的梦魇
  4. Adobe 修复Commerce 和 Magento 平台中的又一个严重RCE
  5. 施耐德EVlink 电动车充电站有新漏洞,可导致电动车遭劫持
  6. Flutter InkWell 动画浅析
  7. Smith Numbers POJ - 1142 (暴力+分治)
  8. WindowsServer2003虚拟机 安装SQL2005失败 终于找到原因了
  9. Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7) 【转】
  10. 码农提高工作效率(转载)