三:java中传统线程互斥

前记

上一篇温习的是java中传统定时器,这次来温习java中传统的线程互斥

场景及代码

我们用一个方法去遍历数组中的所有元素,代码如下

class ArrayUtil{
        public  void traversalArray(String [] param){
            for (int i = 0; i < param.length; i++) {
                System.out.print(param[i]);
            }
            System.out.println();
        }
    }

现在我们启动两个线程去调用这个方法如下:

package com.thread.test;

/*********************************************************************************
//* Copyright (C) 2015 Pingan Haoche (PAHAOCHE). All Rights Reserved.
//*
//* Filename:      TraditionalThreadSynchronized.java 
//* Revision:      1.0
//* Author:        <gao yunqi>
//* Created On:    2016年2月19日
//* Modified by:   
//* Modified On:   
//*
//* Description:   <传统线程之间的互斥>
/********************************************************************************/
public class TraditionalThreadSynchronized {

    /**
     * @param args
     */
    public static void main(String[] args) {
        new TraditionalThreadSynchronized().init();

    }
    public void init (){
        final ArrayUtil  arrayUtil = new ArrayUtil();

            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        arrayUtil.traversalArray(new String[]{"1","2"});
                    }
                }
            }).start();

            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        arrayUtil.traversalArray(new String[]{"a","b"});
                    }
                }
            }).start();

    }

    class ArrayUtil{
        public  void traversalArray(String [] param){
            for (int i = 0; i < param.length; i++) {
                System.out.print(param[i]);
            }
            System.out.println();
        }
    }

}

运行截图
这里写图片描述
很显然这不是我们想要的结果,两个数组之间的值出现了交错混乱,这就是线程不安全所造成的,我们这个时候在方法定义时加上关键字synchronized代码如下

    class ArrayUtil{
        public  synchronized void traversalArray(String [] param){
            for (int i = 0; i < param.length; i++) {
                System.out.print(param[i]);
            }
            System.out.println();
        }
    }

再运行结果
这里写图片描述
再也没有出现交错混乱的情况,这就是线程之间的互斥,当然我们也可以使用同步锁来实现这个功能。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值