分类: Java
2012-09-27 17:11:01
package cn.hinge.yangjun;
public class TraditionalThreadSynchronized {
/*
* 1.线程的安全 通过以下实例便可以理解为了防止没有加线程同步锁,会导致线程之间因cpu 导致打印出的信息会乱。
* 启动2个线程 : a 线程打印: yangrenjun ,b 线程打印 yangtao 如果不加同步锁:侧会出现: ing li 等信息
*
* 静态方法中不能实例化内部类对象,因为内部类一个重要特点就是可以访问外部类的成员变量,如果可以访问外部成员变量,意味一定存在
* 实例对象,而此时mian方法是静态方法,而静态方法执行的时候可以不用实例化对象,此时二者矛盾
* 内部内不能访问局部变量 要加关键字 final
*
* 线程的安全: 多个线程对同一个对象进行访问,取这个对象中的数据。并对数据进行操作,比如银行转帐就是很明显的线程安全实例
*
*/
public static void main(String[] args) {
// 静态方法中不能实例化内部类实例对象 为什么呢?
//回答:静态方法中不能实例化内部类对象,因为内部类一个重要特点就是可以访问外部类的成员变量,如果可以访问外部成员变量,意味一定存在
//实例对象,而此时mian方法是静态方法,而静态方法执行的时候可以不用实例化对象,此时二者矛盾,要通过外部对象调用内部对象才可以访问(意思是想要实例化内部类必须要定义个外部对象)
// final Outputer outputer = new Outputer();
new TraditionalThreadSynchronized().init();
}
private void init(){
final Outputer outputer = new Outputer(); // 内部类不能访问局部变量 要想访问必须声明是 fianl 类型的内部类,内部类对象必须被外部类对象直接调用;
/* 线程 1 调用 output 方法*/
new Thread(new Runnable(){
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("linghongming");
}
}
}).start();
/* 线程 2 output 方法 */
new Thread(new Runnable(){
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
outputer.output("zhangxiaoxiang");
}
}
}).start();
}
/* 定义一个内部类中定义一个方法专门打印一个用户姓名,如果不加同步锁 侧会出现线程安全,会导致打出信息混乱,如果要实现原子性那么就必须加同步锁,同步锁必须针对一个对象 */
class Outputer{
public synchronized 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();
}
}
}