一、为解决线程安全问题,Java引入监视器(monitor)来保证共享数据的同步性。任何对象都可作为一个监视器,关键词synchronized修饰某个对象后,该对象就成为监视器。

二、同步代码块只能有一个线程独占执行。

三、同步代码块作用:多个线程第共享资源操作容易引起冲突,这些容易引起冲突的代码块称之为临界区,在临界区通过引入监视器,并用synchronized使多个线程在临界区同步起来,从而避免可能引起的冲突。

四、Synchronized的三种用法:

1、synchronized代码块:监视器为指定的对象。

2、synchronized方法:监视器为this对象。

3、synchronized静态方法:监视器为相应的类。

一、关键词synchronized加在run方法前

代码展示:

class Resource implements Runnable{volatile public int i;public Resource(int _i){i=_i;}public synchronized void run(){ //关键词synchronized加在run方法前while(true){if(i>0){try{Thread.sleep(200);}catch (Exception e){}i--;System.out.println(Thread.currentThread().getName()+" "+i);}else{System.out.println(Thread.currentThread().getName());break;}}}
}
public class TestSecurity {public static void main(String[] args){Resource m=new Resource(4);Thread t1=new Thread(m);Thread t2=new Thread(m);t1.start();t2.start();}
}

运行结果如下:

补充说明:本程序仅Thread-0完成了i的自减过程,因关键字synchronized加在run()方法前,监视器为Resource对象。系统调度的结果使Thread-0在此刻先获得了Resource监视权,在没有完成Resource对象run方法调用前,Thread-1线程无法获得该监视器所有权。

二、synchronized代码块

代码展示:

class Resource1 implements Runnable{volatile public int i;volatile public Integer it;public Resource1(int _i){i=_i;it=new Integer(i);//new 一个Integer对象的时候,实际上是生成了一个指针指向此对象;}public  void run(){while(true){synchronized (it) {//synchronized代码块if (i > 0) {try {Thread.sleep(200);} catch (Exception e) {}i--;System.out.println(Thread.currentThread().getName() + " " + i);}else {System.out.println(Thread.currentThread().getName());break;}}}}
}
public class TestSecurity1 {public static void main(String[] args){Resource1 m=new Resource1(4);Thread t1=new Thread(m);Thread t2=new Thread(m);t1.start();t2.start();}
}

运行结果如下:

补充说明:此代码增加了一个Resource对象的属性it,它引用一个对象,此对象充当监视器,用synchronized(it)表示,并构成一个同步代码块。当“Thread-1”执行到synchronized(it)代码块时,其获得了该监视权,“Thread-1”未执行完同步代码,“Thread-0”因无法获得监视权而不能进入同步代码块。“Thread-1”执行完同步代码块后,释放监视权,“Thread-0”获得监视权后执行同步代码块,这就实现了两个线程对共享资源操作的同步。

Java线程同步(含详细解释/代码实例)相关推荐

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

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

  2. Java线程同步内存实现

    Java线程同步内存实现 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可 ...

  3. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  4. Java --- 线程同步和异步的区别

    1. Java 线程 同步与异步 多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有 ...

  5. java线程同步原理

    一. java线程同步原理 java会为每个object对象分配一个monitor,当某个对象的同步方法(synchronized methods)被多个线程调用时,该对象的monitor将负责处理这 ...

  6. Java线程--同步和异步的区别

    本文转自https://blog.csdn.net/u011033906/article/details/53840525 1. Java 线程 同步与异步 多线程并发时,多个线程同时请求同一个资源, ...

  7. (转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()

    为了解决对共享存储区的访问冲突,Java 引入了同步机制.但显然不够,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个. 为解决访问控制问题,Java ...

  8. java线程同步——条件对象+synchronized 关键字

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...

  9. java线程同步——竞争条件的荔枝+锁对象

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--竞争条件的荔枝+锁对象 的相关知识: 0.2) for full sou ...

最新文章

  1. 云计算灾备原理与预防恢复方案
  2. 利用python制作的可视化批量文件后缀处理工具
  3. GP学习(六)—Creating geodatabase and connecting geodatabase
  4. 32位dll转64位工具_如何在64位系统中运行32位或16位程序
  5. C语言如何控制控制台窗口大小
  6. 170824、storm 环境搭建
  7. HTB相关TC命令以及内核实现介绍
  8. 【神经网络】激活函数的作用及常用激活函数
  9. 微信公众号主体注销了,怎么办理账号迁移和公证?
  10. k线形态python_Python量化分析之K线模式识别
  11. CAJViwer安装提示:请求的操作需要提升
  12. 我不是蓝牙大神,但还是斗胆对蓝牙学习路线给点建议!
  13. JAVA匹配所有英文_java匹配汉字、英文、数字
  14. 搭建内网ntp时间同步服务器
  15. Tableau图表 • 盒须图、抖动图
  16. Java体系总结 cf2e3d1401904217a28c0bd2d09c5e72
  17. CSP 201609-3 炉石传说(C++)
  18. mirror命令详解
  19. Linux无线网卡配置
  20. SVN 撤回已提交的代码

热门文章

  1. Python之字典查找元素(3种方式)
  2. 台式电脑开不了机的原因以及解决方法
  3. 《C++初阶之路》函数重载
  4. linux内核手帐_linux N卡 steam启动失败解决方案 (32位 库缺失)
  5. 获取染色体长度(bp)
  6. 我在快手总部的一天探访:发现所有人都变得紧张起来了
  7. 快手通过标签添加的我_快手通过关注页添加是什么意思
  8. ArcGIS应用基础4 专题图的制作
  9. 计算机专业英语教程柯晓华,计算机专业英语教程
  10. android 手机采集摄像头视频 socket 视频传输 实时传播