package com.thread_test;
/**
* Created by zhen on 2017-05-25.
*/
public class TraditionalThreadSynchronized {
/**
* 线程互斥
* 多个线程同时操作一个变量,可能引发线程安全问题,经典的例子就是银行余额问题
*/
public static void main(String[] args){
TraditionalThreadSynchronized traditionalThreadSynchronized = new TraditionalThreadSynchronized();
traditionalThreadSynchronized.init();
}
public void init(){
Outer outer = new Outer();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outer.output("zhangxiaoxiang");
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
outer.output("lizhi");
}
}
});
thread1.start();
thread2.start();
}
/**
* 出现类似这种输出:lizhizhangxiaoxiang
* 比较少,但是也会出现。这是因为在一个线程执行输出的途中另一个线程接管了开始其他的输出和运行。也就是output方法被多个线程交互使用了。
* java的处理方式是将可能出问题的代码用东西保护起来,排他性
* synchronized代码块
* synchronized代码块进入需要持有锁,保证不同线程进入该代码块的锁是一致的,那么就可以
* synchronized也可以放在普通方法上,此时的锁为该对象
* synchronized放在静态方法上,此时的锁为类的字节码文件
*
* 不同的场景synchronized业务方法上面的锁最好不要一致
*/
class Outer{
public void output(String name){
int len = name.length();
synchronized(this){
for(int i = 0; i < len; i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
}