同步是多线程中的重要概念。同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。

给一个方法增加synchronized修饰符之后就可以使它成为同步方法,这个方法可以是静态方法和非静态方法,但是不能是抽象类的抽象方法,也不能是接口中的接口方法。下面代码是一个同步方法的示例:

public synchronized void aMethod() {

// do something

}

public static synchronized void anotherMethod() {

// do something

}

线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。

同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;而同步方法是对这个方法块里的代码进行同步,而这种情况下锁定的对象就是同步方法所属的主体对象自身。如果这个方法是静态同步方法呢?那么线程锁定的就不是这个类的对象了,也不是这个类自身,而是这个类对应的java.lang.Class类型的对象。同步方法和同步块之间的相互制约只限于同一个对象之间,所以静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例(对象)没有关系。

如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块。

synchronized 关键字用于保护共享数据。请大家注意“共享数据”,你一定要分清哪些数据是共享数据,请看下面的例子:

public class ThreadTest implements Runnable{

public synchronized void run(){

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

System.out.print(" " + i);

}

}

public static void main(String[] args) {

Runnable r1 = new ThreadTest(); //也可写成ThreadTest r1 = new ThreadTest();

Runnable r2 = new ThreadTest();

Thread t1 = new Thread(r1);

Thread t2 = new Thread(r2);

t1.start();

t2.start();

}}

在这个程序中,run()虽然被加上了synchronized 关键字,但保护的不是共享数据。因为这个程序中的t1,t2 是两个对象(r1,r2)的线程。而不同的对象的数据是不同的,r1,r2 有各自的run()方法,所以输出结果无法预知。

synchronized的目的是使同一个对象的多个线程,在某个时刻只有其中的一个线程可以访问这个对象的synchronized 数据。每个对象都有一个“锁标志”,当这个对象的一个线程访问这个对象的某个synchronized 数据时,这个对象的所有被synchronized 修饰的数据将被上锁(因为“锁标志”被当前线程拿走了),只有当前线程访问完它要访问的synchronized 数据时,当前线程才会释放“锁标志”,这样同一个对象的其它线程才有机会访问synchronized 数据。

转载于:https://www.cnblogs.com/Dragon-Tyrant/p/3717890.html

java实现同步的两种方式相关推荐

  1. SQL Server 2008 数据库同步的两种方式 (发布、订阅)

    参考转载: SQL Server 2008 数据库同步的两种方式 (发布.订阅) 使用Sqlserver事务发布实现数据同步 转载于:https://www.cnblogs.com/YangBinCh ...

  2. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

  3. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

  4. SqlServer2008 数据库同步的两种方式(Sql JOB)

    数据库同步是一种比较常用的功能.以下结合我自己的体会整理的,如果有理解不完全或者有误的地方望大牛不理赐教.下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据 ...

  5. Java 实现抽奖的两种方式

    Java实现抽奖的两种方式 方式一:随机数在哪个区间内返回区间下标 方式二:随机数加入区间点集合排序返回随机数下标 代码示例: ①抽奖入参类型为BigDecimal: package com.cfay ...

  6. Java格式化倒计时的两种方式

    Java格式化倒计时的两种方式 第一种方式 /*** 入参是一个每秒减小1的秒数* 返回一个格式化的时间* * 该方法具有局限性,他在时间大于1个小时的时候,会返回错误的时间* 因为该方法调用了Dat ...

  7. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

  8. Java线程同步的几种方式

    Java线程同步的几种方式 1.使用synchronized关键字  它的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性.  synchronized关键字的用法: ...

  9. java 产生随机数的两种方式,Java产生随机数的两种方式

    Java产生随机数的两种方式 Java产生随机数的两种方式 在java中,我们可以通过两种方式来获取随机数(generating a random number)一种是大家熟悉的java.lang.M ...

最新文章

  1. linux 系统中断信息,关于操作系统:中断处理(Linux /常规)
  2. Python Django 配置404和500错误页面
  3. 算法设计与分析——贪心算法——单个出水口打水问题
  4. 蓝色三角_叶子长得像韭菜,花朵开得像个糖三角的鸢尾,用这3个方法拍摄它...
  5. android监听应用服务,Android应用中Back键的监听及处理实例
  6. 使用php框架文件上传,Laravel框架文件上传功能实现方法示例
  7. 矩阵分解的推荐算法入门-好好看
  8. 正式“退休”的Flash,未来我们会怀念它吗?
  9. EasyExcel ExcelGenerateException: The index of 'xx' and 'xx' must be inconsistent
  10. 关于linux fc多路径巡检
  11. java-极光短信以及通知回调整合
  12. 单TYPE-C口 可支持快充又可传输USB2.0数据方案
  13. iOS自动化笔记(一)WebDriverAgent安装与使用
  14. 面向对象三大特性与C语言
  15. win10网络不出现计算机列表,win10系统电脑不显示无线网络的解决方法
  16. vc工程下的文件后缀解析
  17. 图形学-二维图形的裁剪1.Cohen 2.Liang
  18. Java实现图片(Image)转字符(ASCII)图片
  19. 实战!我用 Wireshark 让你「看得见」 TCP
  20. 为什么说Twitter卸任的CEO杰克多西是一个很神奇的人?

热门文章

  1. cogs 167. [USACO Mar07] 月度花费
  2. yarn========================(类似于node)
  3. 252.Meeting Rooms
  4. 【误区】技术部经理vs技术经理 —— 一字之差谬以千里
  5. DOS 批量修改文件名
  6. Javascript版的Repeater控件实现
  7. 英文标点符号翻译大全
  8. 一个不限制插值个数和上采样倍数的视频增强方法
  9. AI大时代下,零基础进入人工智能领域该如何学习?
  10. 一文入门基于三维数据的深度学习