文档章节

一、加互斥锁Synchronized,保证线程的原子性(多个线程访问的对象的非static方法)

LYQ1990
 LYQ1990
发布于 2016/05/09 12:56
字数 437
阅读 238
收藏 4

 

多个线程同时访问同一个资源----在同一个资源上,加互斥锁Synchronized,保证线程的原子性,在第一个线程代码全部执行结束,再开始执行第二个线程

说明:Outputer类只new了一次线程一和线程二用的是同一个outputer,锁的是同一个对象。否则即使加锁,也无法达到原子性。

 

********************************************************************

线程一:用Outputer类的output方法,打印“张三吃饭”

线程二:用Outputer类的output方法,打印“李四打游戏”

****************如果不加线程锁,会出现类似下面的结果**************

张三李四打游戏

吃饭

***********************解决方法如下********************************

方法一:在Outputer类的output方法,用this给类对象加锁synchronized (this)

 

注明:【不行的方法: 给output方法的参数加锁synchronized (name),第一个线程的name和第二个线程的name不是同一个】

方法二:在Outputer类,定义一个变量,给这个变量加锁

 class Outputer{

    String tempSysch="";

    public void output(String name){

     synchronized (tempSysch) {}

  }

方法三:在Outputer类的output方法上加锁

public synchronized void output(String name) {}

******************************************************************

 

--------------------------------代码如下----------------------

public class TraditionalThreadSynchronized {

  public static void main(String[] args) {
    TraditionalThreadSynchronized th = new TraditionalThreadSynchronized();
    th.init();
  }

  private void init() {
    final Outputer outputer = new Outputer();
    // 线程一:用Outputer类打印“张三吃饭”
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (true) {
          outputer.output("张三吃饭");
        }
      }
    }).start();
    // 线程二:用Outputer类打印“李四打游戏”
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (true) {
          outputer.output2("李四打游戏");
        }
      }
    }).start();
  }

  // Outputer类
  class Outputer {
    // synchronized修饰对象
    public void output(String name) {
      synchronized (this) {
        // synchronized (name) {
        for (int i = 0; i < name.length(); i++) {
          System.out.print(name.charAt(i));
        }
        System.out.println();
      }
    }

    // synchronized修饰方法
    public synchronized void output2(String name) {
      for (int i = 0; i < name.length(); i++) {
        System.out.print(name.charAt(i));
      }
      System.out.println();
    }
  }
}

© 著作权归作者所有

共有 人打赏支持
LYQ1990
粉丝 8
博文 238
码字总数 206220
作品 0
东城
私信 提问
多线程编程学习二(对象及变量的并发访问).

一、概念 非线程安全:会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是"脏读",也就是取到的数据其实是被更改过的. 线程安全:获得的实例变量的值是经过同步处理的...

jmcui
2017/09/09
0
0
java同步synchronized详解

synchronized可以修饰代码块也可以修饰方法,还可以作用于静态方法,类和某个实例。 每个对象都有一把锁,当多个线程同时访问共享资源的时候,需要用到synchronized,synchronized分为代码块...

camillelm
2015/12/08
266
0
Synchronized

1、JavaSE 1.6 之前都认为synchronized是重量级锁,但是1.6进行了各种优化操作,所以并不是想象中那么重了,虽然synchronized的地方使用Lock都能实现,但是synchronized用处还是很广泛。 2、...

learn_more
2016/08/27
25
0
Java 多线程编程核心技术 笔记

外练互斥,内修可见。 1:currentThread() 方法可返回代码正在被哪个线程调用的信息 使用方法:Thread.currentThread.getName() 2:isAlive() 功能是判断当前线程是否处于活动状态 使用方法:T...

西瓜1994
2018/10/12
0
0
【并发编程】线程安全、锁的同步和异步

一、基本概念 线程安全:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 非线程安全:非线程主要是指多个线程对同一个...

qq_26545305
2018/01/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

传统IDC部署网站(三)

11. 重置密码 密钥和密码都支持远程登陆, 二选一 两个都可以登陆, 密钥相对于密码来说,相对安全一点 本地登陆无法是用密钥 修改密码 root 用户 passwd root 修改普通用户 passwd usernam...

miko0089
12分钟前
2
0
日志服务与SIEM(如Splunk)集成方案实战

背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规、审计、与其他相关日志能够导入到您的安全运维中心(SOC)中。 名词解释 LOG(S...

阿里云官方博客
16分钟前
1
0
bash特性

1.支持别名 alias 2.命令替换 $(COMMANS) 或者 `COMMAND` 3. bash支持的引号: `` :命令替换 "":弱引用,可以实现变量替换 '':强引用,不实现变量替换 4.文件名通配 globbing: * : 任意长...

忙碌的小蜜蜂
21分钟前
2
0
以语音评测的PC端demo代码为例,讲解口语评测如何实现

本文由云+社区发表 作者:腾讯智慧教育 概述 腾讯云智聆口语评测(英文版)(Smart Oral Evaluation-English,SOE-E)是腾讯云推出的语音评测产品,是基于英语口语类教育培训场景和腾讯云的语...

腾讯云加社区
33分钟前
1
0
浅谈SpringMVC之DispatcherServlet

Spring的MVC框架是围绕一个DispatcherServlet其实就是个Servlet(它继承自HttpServlet基类)来设计的, 它支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染、文件上传等 控制器一般...

恋码之子
35分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部