线程互斥是指某一资源同时只允许一个访问者(程序调用)对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
[引例]
package cn.sundroid.thread;
public class TestSynchronized {
public static void main(String[] args) {
new TestSynchronized().init();
}
private void init() {
final Printer printer = new Printer();
/**
*开启一个新线程
*/
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
printer.print("sundroid");
}
}
}).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();
}
printer.print("lydon");
}
}
}).start();
}
private class Printer {
private void print(String name) {
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}
修改方法
为什么?
synchronized代表这个方法或者代码块加锁,当前有一个线程正在调用这个方法或者代码块时都必须得等当前线程将该方法或代码块调用完成后,其它等待调用的线程才可以开始调用。
不加synchronized时print方法正在输出“lydon”,这个时候程序直接开始输出“sundroid”,自然会出现“lydonsund”这样类似我们不想看到的结果。