疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

线程的互斥与同步通信问题


 

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