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

2014-11-24 07:45:59 · 作者: · 浏览: 3
;// 此句为 换行。
}


分析:两个线程同时用到了outputer对象:


[java]
class Outputer {
String xxx="";
public void output(String name) {
int len = name.length();
synchronized(xxx){
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();// 此句为 换行。
}
}
}
class Outputer {
String xxx="";
public void output(String name) {
int len = name.length();
synchronized(xxx){
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();// 此句为 换行。
}
}
}
如果改成:new Outputer().output("lihuoming");就有问题了。注意:一定要使用同一个对象。不过:xxx可以用this关键字来代替,不然就多此一举了。

2,倘若我要保护output整个方法的代码,怎么办:那就在这个方法里面用:synchronized这个关键字。


下面代码也是灭有问题的,保护的地区不一样,不过也都是同一个对象:

[java]
package com.itm.thread;

/*******************
*
* 在静态方法中 不能 new 内部类的实例对象:内部类可以访问 外部类的成员变量,
*
* 就是说:我能访问你的成员变量意味着你一定有了实例对象。
*
* 而在 静态方法执行的时候 可以不用创建那个对象,就矛盾了。
*
* main方法运行的时候,没有任何外部类的实力对象,而这个内部类创建了,
* 实际上又可以访问外部类的成员变量,而没有这个成员变量。
*
* 要想创建 内部类的实例对象,必须要创建外部类的实例对象,外部类的实力对象 必须要整出来。
*
* (1)内部类不能访问局部变量 要加final的。
*
* 我能访问你的成员变量 意味着你一定有了实例对象。而在 静态方法中 执行的时候 不用创建 那个实力对象。
*
*
*
* @author wang.dm
*
*/
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.output2("lihuoming");


}
}
}).start();
}

class Outputer {
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();// 此句为 换行。
}
}

public synchronized void output2(String name) {
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.cha