文档章节

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

LYQ1990
 LYQ1990
发布于 2016/05/09 12:56
字数 437
阅读 236
收藏 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
粉丝 6
博文 235
码字总数 203071
作品 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.1 临界区 保证在某一时刻只有一个线程能访问数据的简便方法,在任意时刻只允许一个线程对资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后,其他所有试图访问临界...

glmapper
2017/10/08
0
0
Java虚拟机--(互斥同步与非阻塞同步)和锁优化

线程安全的实现方法: 互斥同步(悲观锁): 互斥同步是常见的一种并发正确性保障手段。同步是指在多个线程并发访问数据时,保证共享数据在同一时刻只被一个(或是一些,使用信号量的时候)线...

霍淇滨
03/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

咕泡-Factory设计模式笔记

个人感悟: 设计模式都是处理复杂问题的,如果问题本身很简单,使用设计模式反而累赘,增加了开发的复杂性 遇到最简单的情况,直接 new 如果创建对象的过程简单,但是需要匹配不同情况,返回...

职业搬砖20年
23分钟前
0
0
Java中的锁分类

在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏...

Funcy1122
31分钟前
0
0
Ansible随机数

想为你的Ansible剧本取一个随机数?还想在接下来的运行中保持系统的等幂性?这里有一个答案。 假如,你要为一大批服务器设置cron任务,却不想让它们同时启动,你可以这样设置分钟数: minute...

大别阿郎
40分钟前
0
0
SpringCloud之服务注册中心Eureka

本系列介绍的配置均基于 Spring Boot 2.0.1.RELEASE 版本和 Spring Cloud Finchley.SR1 服务注册中心 Spring Cloud 已经帮我们实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。 ...

熊小飞呀
今天
15
1
“Comparison method violates ...”异常的再现方法

前提条件:JDK8 代码: import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class Test { public stat......

hunterli
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部