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

2014-11-24 07:45:59 · 作者: · 浏览: 2
rAt(i));
}
System.out.println();// 此句为 换行。
}
}



}
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.charAt(i));
}
System.out.println();// 此句为 换行。
}
}

}

3, 下面代码 问:方法1,2能否分别和方法3 同步???


[java]
static 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.charAt(i));
}
System.out.println();// 此句为 换行。
}

public static synchronized void output3(String name) { // 静态的一定要在静态类中,所以:写这行代码时,就要再类上 加上 static了。
int len = name.length();
for (int i = 0; i < len; i++) {
System.out.print(name.charAt(i));
}
System.out.println();// 此句为 换行。
}
static 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.charAt(i));
}
System.out.println();// 此句为 换行。
}

public static synchronized void out