java5编程(3)传智播客_张孝祥_传统线程互斥技术经典解析 (二)

2014-11-24 07:45:59 · 作者: · 浏览: 1
创建了外部类的对象,
// 这个方法运行的时候,一定有一个对象,
private void init(){
final Outputer outputer = new Outputer();//这个家伙一定要找一个外部类,也就是 谁调用了 init()方法。

new Thread(new Runnable(){
@Override
public void run() {

while(true){
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");

}
}
}).start();

new Thread(new Runnable(){
@Override
public void run() {

while(true){
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("lihuoming");

}
}
}).start();
}

class Outputer {
String xxx="";
public void output(String name) {
int len = name.length();

synchronized(name){
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();// 此句为 换行。
}
}
}

}
public class TraditionalThreadSynchronized {

/**
* @param args
*/
public static void main(String[] args) {

new TraditionalThreadSynchronized().init();
}
//方法被调用的时候 一定是 某对象身上的方法,因为他不是静态方法,一定是创建了外部类的对象,
// 这个方法运行的时候,一定有一个对象,
private void init(){
final Outputer outputer = new Outputer();//这个家伙一定要找一个外部类,也就是 谁调用了 init()方法。

new Thread(new Runnable(){
@Override
public void run() {

while(true){
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");

}
}
}).start();

new Thread(new Runnable(){
@Override
public void run() {

while(true){
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("lihuoming");

}
}
}).start();
}

class Outputer {
String xxx="";
public void output(String name) {
int len = name.length();

synchronized(name){
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();// 此句为 换行。
}
}
}

}

上面代码,出现:中间代码被打乱,也就是多线程喜欢出的问题。一个事情没有办完,另一个事件就会发生,为了防止这个问题,我们用同步技术。


[java]
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();// 此句为 换行。
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();// 此句为 换行。
这段代码要实现原子性。就是说,当有一个县城来执行我的时候,别的县城不能够来执行我;就像厕所里的坑一样,嘎嘎

synchronized(name){// 起不到效果,互斥一定要做到同一个对象。
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println()