本节主要作为一个笔记,用来记录synchronized关键字。

首先看一个例子:

public class Mythread extends Thread {private int count = 5;public  void run(){count--;System.out.println(this.currentThread().getName() + " count=" + count); }public static void main(String[] args) {Mythread mythread = new Mythread();Thread t1 = new  Thread(mythread,"t1");Thread t2 = new  Thread(mythread,"t2");Thread t3 = new  Thread(mythread,"t3");Thread t4 = new  Thread(mythread,"t4");Thread t5 = new  Thread(mythread,"t5");t1.start();t2.start();t3.start();t4.start();t5.start();  }
}

执行结果:

显然,前面我们的目的主要是向让count的值进行连续减操作,启用5个线程,然后达到目的。但是结果却不是想象的那样。为此引入Synchronized关键字。

引入synchornized的目的主要在于控制run中的count--操作,因此将关键字加在run方法上。上述代码可以改为:

 public synchronized void run(){count--;System.out.println(this.currentThread().getName() + " count=" + count);}

再次执行,可以得到我们想要的结果:

在这里注意前面的 线程顺序,如果仅仅是为了得到后面的43210这个结果,无须考虑,但是如果有兴趣,就会产生疑问,进一步挖掘一下synchornized的知识。

在没有添加synchronized的时候,当多个线程访问Mythread:

五个线程共同访问Mythread中的run方法,大家创建有先后,却需操作CPU资源为其服务,大家集中到Mythread的时候,就需要随缘,看看CPU能够是否能为分配相应的资源。因此就会明白再没有关键字修饰的时候就会产生这样的一系列问题,先创建的线程不一定能够得到自己所需要的资源,而后到的线程也不一定就得不到自己的资源。

各个线程在得到自己的资源之后,开始进行执行,如果各个线程在得到资源的时间点上,count刚好被其中一个线程使用,并且还没有处理完毕,那么其得到的处理结果就可能和其他线程的处理结果相同。这就是在没有加入synchronized的时候的情况。

加入synchronized之后,synchronized锁是对象锁,也就是说new  MyThread()的结果就是也new出了一把锁,将新new的对象里面内容都锁起来了,别人想要用这个对象的时候需要这个锁不被占用:

因此,各个线程被创建后,访问mythread类中的run方法的时候会先去请求锁,如果能得到这个锁,才会允许其访问run方法,否则不允许。这样就保证每个线程访问的单一行为,不会造成无序的情况。执行的结果自然就是我们想要的有序结果。

synchronized关键字相关推荐

  1. Java 多线程(六) synchronized关键字详解

    多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...

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

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

  3. Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语

    标签: Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功 ...

  4. Java多线程:synchronized关键字和Lock

    一.synchronized synchronized关键字可以用于声明方法,也可以用来声明代码块,下面分别看一下具体的场景(摘抄自<大型网站系统与Java中间件实践>) 案例一:其中fo ...

  5. synchronized关键字以及实例锁 类锁

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...

  6. JAVE SE 学习day_09:sleep线程阻塞方法、守护线程、join协调线程同步方法、synchronized关键字解决多线程并发安全问题

    一.sleep线程阻塞方法 static void sleep(long ms) Thread提供的静态方法sleep可以让运行该方法的线程阻塞指定毫秒,超时后线程会自动回到RUNNABLE状态,等待 ...

  7. Java多线程初学者指南(10):使用Synchronized关键字同步类方法

    要想解决"脏数据"的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() {     ...

  8. java的同步关键字_简单了解Java synchronized关键字同步

    简单了解Java synchronized关键字同步 发布于 2021-1-13| 复制链接 摘记:  synchronized synchronized可以用来同步块,同步方法.同步块可以用来更精确 ...

  9. Java多线程闲聊(六):synchronized关键字

    Java多线程闲聊(六):synchronized关键字 前言 这篇文章我会在博客置顶,为什么呢?因为,三篇引用的文章写得太好了,我害怕后面找不到,看不到,然后忘了! 让我想想,感觉昨天的前言把最近肚 ...

  10. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解

    Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有 ...

最新文章

  1. kmeans聚类源代码
  2. 认证(登录)功能实现
  3. 地砖中间高四边低_地砖上墙到底好不好?幸好我家没这么做否则全毁了!
  4. 连续加班2周做出来的功能,老板说先不做了
  5. 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 新增日志模块
  6. python中 if __name__ == ‘__main__‘
  7. Google,Guava本地高效缓存
  8. 星云的Linux专用学习手册
  9. ai人工智能使用的软件_MachineRay:使用AI创造抽象艺术
  10. 易语言手动和代码创建数据库
  11. c语言九宫格拼图程序,C语言简单游戏编程学习入门之九宫格拼图
  12. Exception: ROM is missing for pong, see https://github.com/openai/atari-py#roms for instructions
  13. 简单粗暴的动态气泡图
  14. [嵌入式]Cortex-A8处理器编程(上)
  15. 关于win10输入法导致电脑直接卡机无法动弹问题
  16. Linux下配置DNS服务
  17. 字符串格式化(format()使用)
  18. ROI Pooling的作用及意义
  19. win10出现的各种问题
  20. php 提取登录QQsid_PHP实现QQ登录实例代码

热门文章

  1. 手机加速度传感器在Android横竖屏切换中的应用
  2. Hibernate与JPA
  3. android 坚挺通话广播_Android智能机 摩托罗拉MileStone坚挺
  4. 奔向三张,不破不立:一个iOS开发工程师的职业规划思考(转自iOSer 逆,以资激励)
  5. R语言cowplot介绍——把不同的图像拼接到一起
  6. matplolib种横坐标斜着显示
  7. 第四次作业-微软必应词典客户端
  8. Android Studio 从入门到精通视频教程
  9. requests.exceptions.ChunkedEncodingError: (‘Connection broken: IncompleteRead(0 bytes read)‘, Incomp
  10. Alex Woodie:2019大数据预测