Synchronize的使用场景

Synchronize可以使用在一下三种场景,对应不同的锁对象

场景

synchronized代码块

synchronized方法

synchronized静态方法

锁对象

任意对象

this 对象

该类的字节码对象 *.class

没有同步代码实例

public class SyncSample {

public static void main(String[] args) {

Couplet couplet = new Couplet();

for (int i = 1; i < 1000; i++)

new Thread() {

public void run() {

int r = new Random().nextInt(2);

if (r % 2 == 0){

couplet.first();

}else {

couplet.second();

}

}

}.start();

}

}

class Couplet {

public void first() {

System.out.printf("琴");

System.out.printf("瑟");

System.out.printf("琵");

System.out.printf("琶");

System.out.println();

}

public void second() {

System.out.printf("魑");

System.out.printf("魅");

System.out.printf("魍");

System.out.printf("魉");

System.out.println();

}

}

运行结果

...

魑魅魍魉

琴瑟琵琶

琴瑟琴瑟琵琶

魍魉

琴瑟琵琶

琴瑟琵魅魍魉

魑魅瑟琵琶

1. synchronized代码块 解决

class Couplet {

//创建锁对象 可以是任意对象 也可用当前对象this

Object lock = new Object();

public void first() {

//代码块 需要有锁对象

synchronized (lock) {

System.out.printf("琴");

System.out.printf("瑟");

System.out.printf("琵");

System.out.printf("琶");

System.out.println();

}

}

public void second() {

//代码块 需要有锁对象

synchronized (lock) {

System.out.printf("魑");

System.out.printf("魅");

System.out.printf("魍");

System.out.printf("魉");

System.out.println();

}

}

}

运行结果

琴瑟琵琶

魑魅魍魉

琴瑟琵琶

魑魅魍魉

2. synchronized方法 同步方法解决

class Couplet {

//同步方法 this当前对象就是锁对象

public synchronized void first() {

System.out.printf("琴");

System.out.printf("瑟");

System.out.printf("琵");

System.out.printf("琶");

System.out.println();

}

//代码块与同步方法 同步时 使用this当前对象

public void second() {

synchronized (this){

System.out.printf("魑");

System.out.printf("魅");

System.out.printf("魍");

System.out.printf("魉");

System.out.println();

}

}

}

运行结果

琴瑟琵琶

魑魅魍魉

琴瑟琵琶

魑魅魍魉

3. synchronized静态方法

class Couplet {

//静态同步方法 当前对象.class 的字节码对象就是锁对象

public synchronized static void first() {

System.out.printf("琴");

System.out.printf("瑟");

System.out.printf("琵");

System.out.printf("琶");

System.out.println();

}

//代码块与静态方法同步时 使用当前字节码锁对象

public void second() {

synchronized (Couplet.class){

System.out.printf("魑");

System.out.printf("魅");

System.out.printf("魍");

System.out.printf("魉");

System.out.println();

}

}

}

运行结果

琴瑟琵琶

魑魅魍魉

琴瑟琵琶

魑魅魍魉

java syncr_JAVA基础—Synchronized线程同步机制相关推荐

  1. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  2. 线程同步机制synchronized中锁的判断以及锁的作用范围

    当我们使用多个线程访问同一资源(可以是同一个变量.同一个文件.同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题,但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题. 要 ...

  3. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  4. 学习java的第四十天,线程的优先级、守护线程、线程同步机制、死锁

    一.线程的优先级(priority) Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行. 线程的优先级用数字表示,范围1~10 Thr ...

  5. 对Java多线程编程的初步了解,实现多线程的三种方式以及多线程并发安全的线程同步机制

    什么叫进程?什么叫线程? 进程相当于一个应用程序,线程就是进程中的一个应用场景或者说是一个执行单元,一个进程可以启动多个线程,每个线程执行不同的任务,一个线程不能单独存在,他必须是进程的一部分,当进程 ...

  6. 解析JVM线程同步机制

    http://blog.csdn.net/thl789/article/details/566494 对多线程的支持一般是在OS级的,而Java将其做在了语言级别,这其中最吸引人的莫过于Java对线程 ...

  7. Java并发编程之线程同步

    线程安全就是防止某个对象或者值在多个线程中被修改而导致的数据不一致问题,因此我们就需要通过同步机制保证在同一时刻只有一个线程能够访问到该对象或数据,修改数据完毕之后,再将最新数据同步到主存中,使得其他 ...

  8. 01 线程同步机制封装类

    01 线程同步机制封装类 RAII RAII全称是"Resource Acquisition is Initialization",直译过来是"资源获取即初始化" ...

  9. Linux中的线程同步机制-futex

    Linux中的线程同步机制(一) -- Futex 引子 在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这 ...

最新文章

  1. 第十六届全国大学生智能车竞赛技术报告 | 单车拉力组- 上海海事大学-骑摩托的蒙娜丽莎
  2. c语言程序设保安值班,保安值班系统
  3. (原创总结) 几种通信编码方式
  4. 《见字如面》赏析-待续
  5. 实名羡慕,国内这些厂.NET薪资高的吓人!
  6. sql server 跟踪_SQL Server跟踪标志指南; 从-1到840
  7. MySQL结果集 数据查询(重点)
  8. 如何使用Movavi Video Editor编辑婚礼影片?
  9. sklearn——model_selection——knn手写识别系统+iris分类
  10. 过滤字符串 和 select选择后控件值变更
  11. 民企信息化建设个人经历(一)
  12. matlab创建数组
  13. 3dmax最基础的建模教程,初学者福利
  14. 周纪三 周慎靓王元年(辛丑,公元前320年)——摘要
  15. linux连接无线网络配置详解
  16. 士不可以不弘毅,任重而道远!
  17. 【软件测试】快速入行软件测试
  18. STL迭代器(iterator)用法详解
  19. 南京工业大学计算机考研难吗,南京工业大学(专业学位)计算机技术考研难吗
  20. php上传图片到mysql并显示

热门文章

  1. Python读写文件的路径,关于os.chdir(path)位置对程序的影响,
  2. 数学题 HDOJ——2086 简单归纳
  3. PHPCMS 模板的设置
  4. php_mysql注入load_file()IIS配置文件获取
  5. 【数据结构与算法】堆
  6. android开发app初始化,安卓快速开发框架(一)XBaseAndroid初始化使用
  7. cdr怎么做文字路径_整理128张图片,告诉你文字少的PPT应该怎么做?
  8. 中南大学和中山大学计算机专业哪个好,中山大学和中南大学哪个实力更强?一字之差,一起来看看吧!...
  9. c语言怎样输入动态数组代码,求助~~ 如何把数组变成动态输入的?
  10. bbb sdk6编译流程