Chinaunix首页 | 论坛 | 博客
  • 博客访问: 204024
  • 博文数量: 66
  • 博客积分: 966
  • 博客等级: 准尉
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-11 11:52
文章分类

全部博文(66)

文章存档

2012年(60)

2011年(6)

分类: 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();
     }
  
 }
 
 
 
 
 

}

阅读(1246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~