Java多线程同步方法

package com.wkcto.intrinsiclock;

/**

* synchronized同步实例方法

* 把整个方法体作为同步代码块

* 默认的锁对象是this对象

* Author: 老崔

*/

public class Test05 {

public static void main(String[] args) {

//先创建Test01对象,通过对象名调用mm()方法

Test05 obj = new Test05();

//一个线程调用mm()方法

new Thread(new Runnable() {

@Override

public void run() {

obj.mm(); //使用的锁对象this就是obj对象

}

}).start();

//另一个线程调用mm22()方法

new Thread(new Runnable() {

@Override

public void run() {

obj.mm22(); //使用的锁对象this也是obj对象, 可以同步

// new Test05().mm22(); //使用的锁对象this是刚刚new创建的一个新对象,不是同一个锁对象不能同步

}

}).start();

}

//定义方法,打印100行字符串

public void mm(){

synchronized ( this ) { //经常使用this当前对象作为锁对象

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

//使用synchronized修饰实例方法,同步实例方法, 默认this作为锁对象

public synchronized void mm22(){

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

package com.wkcto.intrinsiclock;

/**

* synchronized同步静态方法

* 把整个方法体作为同步代码块

* 默认的锁对象是当前类的运行时类对象, Test06.class, 有人称它为类锁

* Author: 老崔

*/

public class Test06 {

public static void main(String[] args) {

//先创建Test01对象,通过对象名调用mm()方法

Test06 obj = new Test06();

//一个线程调用m1()方法

new Thread(new Runnable() {

@Override

public void run() {

obj.m1(); //使用的锁对象是Test06.class

}

}).start();

//另一个线程调用sm2()方法

new Thread(new Runnable() {

@Override

public void run() {

Test06.sm2(); //使用的锁对象是Test06.class

}

}).start();

}

//定义方法,打印100行字符串

public void m1(){

//使用当前类的运行时类对象作为锁对象,可以简单的理解为把Test06类的字节码文件作为锁对象

synchronized ( Test06.class ) {

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

//使用synchronized修饰静态方法,同步静态方法, 默认运行时类Test06.class作为锁对象

public synchronized static void sm2(){

for (int i = 1; i <= 100; i++) {

System.out.println(Thread.currentThread().getName() + " --> " + i);

}

}

}

package com.wkcto.intrinsiclock;

/**

* 同步方法与同步代码块如何选择

* 同步方法锁的粒度粗, 执行效率低, 同步代码块执行效率高

*

* Author: 老崔

*/

public class Test07 {

public static void main(String[] args) {

Test07 obj = new Test07();

new Thread(new Runnable() {

@Override

public void run() {

obj.doLongTimeTask();

}

}).start();

new Thread(new Runnable() {

@Override

public void run() {

obj.doLongTimeTask();

}

}).start();

}

//同步方法, 执行效率低

public synchronized void doLongTimeTask(){

try {

System.out.println("Task Begin");

Thread.sleep(3000); //模拟任务需要准备3秒钟

System.out.println("开始同步");

for(int i = 1; i <= 100; i++){

System.out.println(Thread.currentThread().getName() + "-->" + i);

}

System.out.println("Task end");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//同步代码块,锁的粒度细, 执行效率高

public void doLongTimeTask2(){

try {

System.out.println("Task Begin");

Thread.sleep(3000); //模拟任务需要准备3秒钟

synchronized (this){

System.out.println("开始同步");

for(int i = 1; i <= 100; i++){

System.out.println(Thread.currentThread().getName() + "-->" + i);

}

}

System.out.println("Task end");

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

java 线程同步的方法_Java多线程同步方法相关推荐

  1. java线程的实现方法_Java多线程的四种实现方式

    1.Java多线程实现的方式有四种: 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的targ ...

  2. java 线程的基本概念_Java多线程——基本概念

    线程和多线程 程序:是一段静态的代码,是应用软件执行的蓝本 进程:是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程 线程:是比进 ...

  3. java实现线程同步的方法_Java实现线程同步方法及原理详解

    一.概述 无论是什么语言,在多线程编程中,常常会遇到多个线同时操作程某个变量(读/写),如果读/写不同步,则会造成不符合预期的结果. 例如:线程A和线程B并发运行,都操作变量X,若线程A对变量X进行赋 ...

  4. java线程休眠sleep函数_Java多线程中sleep()方法详解及面试题

    一. Java线程生命周期(五个阶段) 新建状态就绪状态运行状态阻塞状态死亡状态 如图 二.sleep方法 API中的解释 static voidsleep(long millis) 使当前正在执行的 ...

  5. java线程同步的实现_Java并发编程(三) - 实战:线程同步的实现

    synchronized关键字 首先,来看一个多线程竞争临界资源导致的同步不安全问题. package com.example.weishj.mytester.concurrency.sync; /* ...

  6. java 线程的基本概念_Java多线程——多线程的基本概念和使用

    一.进程和线程的基础知识 1.进程和线程的概念 进程:运行中的应用程序称为进程,拥有系统资源(cpu.内存) 线程:进程中的一段代码,一个进程中可以有多段代码.本身不拥有资源(共享所在进程的资源) 在 ...

  7. java线程中的死锁_Java多线程中的死锁 - Break易站

    Java 多线程 synchronized关键字用于使类或方法线程安全,这意味着只有一个线程可以锁定同步方法并使用它,其他线程必须等到锁定释放并且其中任何一个获得该锁定. 如果我们的程序在多线程环境中 ...

  8. java线程的内存模型_java多线程内存模型

    java多线程内存模型: 可见性 要实现共享变量的可见性,必须保证两点: 1.线程修改后的共享变量能够及时从工作内存刷新到主内存中: 2.其他线程能够及时把共享变量的最新值从主内存更新到自己的工作内存 ...

  9. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

最新文章

  1. IntelliJ IDEA 2020.2 EAP 5 发布:完美支持Java 15
  2. 剑指offer-栈的压入、弹出序列
  3. stm32 无符号整形_十进制字符串转化为无符号整数
  4. Docker快速搭建TeamSpeak多人语音聊天服务器
  5. 佛系听歌?Beats推出“串珠”耳机 盘它?
  6. 汇编软件DOSBox使用教程
  7. 腾讯笔试题:纸牌游戏
  8. 程序员请万分珍重你的第一份工作,否则后悔了概不负责
  9. 揭秘有状态服务上 Kubernetes 的核心技术
  10. 信息检索关键词的进阶使用
  11. RFID入门:Mifare1智能洗澡卡破解分析
  12. Java基础(二)集合
  13. 3DMAX一键生成螺母和螺栓插件使用教程
  14. 主流互联网开发平台一览
  15. 实现父类一个动物的类, 包括成员变量名字年龄皮毛颜色,带参数构造函数,动物类有一个方法,move,打印动物是可以动的 1.《实现一个子类老鼠的类,继承动物类,老鼠类继承父类成员变量,老鼠还有个自己的属
  16. 金助教——定义互动教学管理新模式
  17. 如何做一个搜索引擎友好的站点?
  18. 反馈线性化类有哪些最新发表的毕业论文呢?
  19. 从《陈六事疏》说开去
  20. SqlServer跨库查询

热门文章

  1. ACM入门之【并查集】
  2. 2021夏季每日一题 【week5 完结】
  3. 【AC Saber】二进制
  4. css京东购物车静态页面实现
  5. Dubbo架构的特点
  6. CSS设置像文字一样的按钮
  7. 显示网格_快速制图软件 Edraw Max教程:Edraw Max怎么显示出网格线?
  8. druid seata 配置_五分钟带你了解Seata分布式事务
  9. 卧槽,B站联名键盘!
  10. git提交代码到github时出现everything up-to-date,但是代码没有上传成功