前记
上一篇温习的是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();
}
}
再运行结果
再也没有出现交错混乱的情况,这就是线程之间的互斥,当然我们也可以使用同步锁来实现这个功能。