所有对象都自动含有单一的锁,也就是所有对象都有且只有唯一的锁,所以当某个任务(线程)访问一个类A中含有sycnhronized的方法是,那么在这个线程从该方法返回之前(也就是该方法在当前线程执行完之前),类A中的其他被该关键字标记的方法在其他的线程中都会被阻塞。
            通俗点说就是,当调用A的含有synchronized的方法是,A会被枷锁,此时A中其他含有synchronized方法只有等到前一个方法调用完毕释放了锁才能被调用

具体说明见另一篇博客<<java同步和互斥》

下面看看具体的程序,其中,Timer中的字段num是共享资源

public class TestSync implements Runnable {Timer timer = new Timer();public static void main(String[] args) {TestSync test = new TestSync();Thread t1 = new Thread(test);Thread t2 = new Thread(test);t1.setName("t1"); t2.setName("t2");t1.start(); t2.start();}public void run(){timer.add(Thread.currentThread().getName());}
}class Timer{private static int num = 0;public  void add(String name){ num ++;try {Thread.sleep(1);} catch (InterruptedException e) {}System.out.println(name+", 你是第"+num+"个使用timer的线程");}
}

由于没有同步,所以运行结果如下所示

t1, 你是第2个使用timer的线程

t2, 你是第2个使用timer的线程

也就是说当线程一运行到num++的时候被打线程2打断了,由于java中递增和递减操作均不是原子操作,所以本程序中即使没有调用sleep,也会出现这种被打断的情况

下面看看同步的效果

 public void add(String name) {synchronized (this) {//同步num++;try {Thread.sleep(1000);} catch (InterruptedException e) {}System.out.println(name + ", 你是第" + num + "个使用timer的线程");}}

这样运行结果就会出是正确的

t1, 你是第1个使用timer的线程

t2, 你是第2个使用timer的线程

但是,下面为了说明问题把TestSync里面的run方法改成如下所示

 public void run() {
//       time.add(Thread.currentThread().getName());try {Thread.sleep(1000);//为了显示结果,让其睡眠一秒} catch (InterruptedException ex) {Logger.getLogger(TestSync.class.getName()).log(Level.SEVERE, null, ex);}System.out.println(Thread.currentThread().getName() + "----");}

那么在此运行就是

t1, 你是第1个使用timer的线程

t2, 你是第2个使用timer的线程

t1--------

t2--------

而不是你所想象的

t1, 你是第1个使用timer的线程
t1----
t2, 你是第2个使用timer的线程
t2----

原因就是在线程t1在睡眠的时候,线程t2切换进来,执行了一次,怎样得到正确的结果呢,下面把TestSync里面的run方法做如下改进就可以得到上面预期的结果

 public void run() {synchronized(time){time.add(Thread.currentThread().getName());try {Thread.sleep(3000);} catch (InterruptedException ex) {Logger.getLogger(TestSync.class.getName()).log(Level.SEVERE, null, ex);}System.out.println(Thread.currentThread().getName() + "----");}}

因为t1先获得time的锁,所以在执行完run里面的同步块之前,即使sleep(),t2也不会执行,因为t2没有获得time的锁,且sleep()操作也不释放锁(这也是和wait的巨大区别)

java同步和互斥程序说明(一)相关推荐

  1. java同步互斥功能检测_猿考研之操作系统篇三(进程同步,管程,死锁)

    进程同步 进程具有异步性的特征.异步性是指,各并发执行的进程以各自独立的.不可预知的速度向前推进. 同步机制应遵循的准则 空闲让进:其他进程均不处于临界区: 忙则等待:已有进程处于其临界区: 有限等待 ...

  2. java什么时候需要同步_JAVA中线程在什么时候需要同步和互斥

    JAVA中线程在什么时候需要同步和互斥 关注:265  答案:6  mip版 解决时间 2021-01-27 08:10 提问者时光易老 2021-01-27 03:32 JAVA中线程在什么时候需要 ...

  3. Java基础_17 | Java多线程程序设计(Java中两种创建线程的方法、多线程之间的同步和互斥)

    1. 多线程实现最核心的机制 一个程序在其执行过程中, 可以产生多个线程, 形成多条执行线索.,每条线程,有产生.存在和消亡的过程,并且独立完成各自的功能,互不干扰. 多线程程序运行只占用一个CPU, ...

  4. Java并发,并行,同步,互斥

    2019独角兽企业重金招聘Python工程师标准>>> 一切都要从这个世界的并行性开始说,事物的发展总是并行进行的,汽车在奔驰的同时,自行车也在行驶;别人正在唱歌,你可能正在吃饭;等 ...

  5. 【Java线程】互斥 同步 异步 并发 多线程的区别与联系

    1. 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行.其中两种并发关系分别是同步和互斥: 2. 互斥:进程间相互排斥的使用临界资源的 ...

  6. 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

    多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...

  7. 死磕 java同步系列之ReentrantReadWriteLock源码解析

    问题 (1)读写锁是什么? (2)读写锁具有哪些特性? (3)ReentrantReadWriteLock是怎么实现读写锁的? (4)如何使用ReentrantReadWriteLock实现高效安全的 ...

  8. java 同步方式 lock_java的两种同步方式, Synchronized与ReentrantLock的区别

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  9. Java同步组件之CyclicBarrier,ReentrantLock

    文章目录 Java同步组件概况 `CyclicBarrier`介绍 与`CountDownLatch`比较 相同点 不同点 `CountDownLatch`和`CyclicBarrier`的场景比较 ...

  10. JAVA程序中怎么看线程的个数_一个文件中有10000个数,用Java实现一个多线程程序将这...

    18 推荐 运行结果: 编辑于 2015-07-16 17:20:57 回复(11) 12 自己重写了一下推荐答案,加了些注释方便理解 package threadpackage; import ja ...

最新文章

  1. Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程
  2. static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
  3. 40个超酷的jQuery动画教程
  4. 理论基础 —— 队列
  5. AbstractQueuedSynchronizer源码
  6. 在 Azure Web 应用中创建 PHP 应用程序
  7. 浅谈面粉厂防爆的重要性及措施(转)
  8. 机器学习- 吴恩达Andrew Ng - week3-3 Multiclass Classification
  9. 欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 最新版本:20110222
  10. WPS页眉页脚怎么设置每页不同
  11. ie8位16进制色转换工具
  12. java随笔 2008年
  13. 疫情之下,我们该如何选择工作?
  14. CSS中禁止文本选中和鼠标悬入变手型(已解决)
  15. 小提琴统计图_快速绘制分组小提琴图工具
  16. 办公室设计公司关于办公室装修全过程解剖
  17. pga是啥oracle,Oracle数据库内存体系 - PGA
  18. Ubuntu下安装最新的搜狗输入法
  19. Next '21 大会倒计时 1 天丨与 Google Cloud 一起寻找打开数字化的“云钥匙”
  20. 如何用python爬取公众号文章_如何使用 Python 爬取微信公众号文章

热门文章

  1. 多分类决策树 r语言_R语言——决策树模型的相关可视化
  2. EasyUI:导出datagrid数据到桌面
  3. 利萨茹(Lissajous)曲线动画演示
  4. ICCV 2021 best paper-Swin Transformer:对各类SOTA的降维打击!
  5. Logistic回归及梯度上升算法
  6. 如何确定windows启动类型是bios还是uefi
  7. 设置pyspark 启动时所使用的python版本
  8. [转]链接中 href='#' 和 href='###' 的区别以及优缺点
  9. C++/CLI的简单介绍。from维基百科们,http://zh.wikipedia.org/zh-cn/C%2B%2B/CLI
  10. Pointer Networks简介及其应用(格式化)