多线程:(一)线程同步

对于多线程,我自己的应用之处,确实很少,近期在用一些javaweb框架之时,总感觉迷迷糊糊,从基础的类的创建、变量的类型、结构的设计、框架的实现原理、设计模式…等等,这些,都让我突然感觉,我好像什么都不会了,好想知道“为什么!”。这莫非就是所说的“瓶颈期”吧!哈,不多说,开始总结。

本次包括后面的多线程总结,主要是根据张老师的视频and一本从入门到放弃,以及度娘来的。(很零散!)
先从最开始的地方开始。在Java中,多线程常用的实现有两种方式:
1、扩展java.lang.Thread类
2、实现java.lang.Runnable接口(基本都用这个:优点-java中可以实现多个接口;再就是,更符合面向对象的思维)

写在代码之前:多个线程对同一对象的操作,才会引起过程的混乱(不安全),所以,事例代码中,用一个类对象作为这个公共对象去说明,同时,该类中,封装了多个线程对所执行的业务逻辑,这样处理的好处就是便于维护。最后,为了方便演示,该类以内部类的方式声明!

惯例:码上学习!
/**
 用两个线程,分别打印nashinianshao(那时年少)和qingkuang(轻狂)。在不加synchronized关键字时,会出现打印混乱的情况(第一个线程刚打印了nashin,第二个线程就开始qingkuang)。
*/
public class ThreadSynchronized {

    public static void main(String[] args) {
        new ThreadSynchronized().init();
    }

    private void init() {
        //在使用内部类创建对象之前,应该先有外部类对象,所以在18行这么调用。
        final Outputer outputer = new Outputer();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        //睡一会,不然的话,一直疯狂打印,计算机会卡屏
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    outputer.output("nashinianshao");
                }

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    outputer.output3("qingkuang");
                }

            }
        }).start();

    }

    static class Outputer {
        //String pubObject = "";
        //方法1:synchronize包在逻辑代码块外面,()中的对象,可以用58行的pubObject作为两个线程的公共对象;也可以用“this”表示当前new的对象(效果同方法2);当然也可以像现在这样,用类的字节码,这样的话,和方法3(静态方法,公共对象采用的肯定只有类的字节码了)效果就一样了
        public void output(String name) {
            int len = name.length();
            synchronized (Outputer.class) {
                for (int i = 0; i < len; i++) {
                    System.out.print(name.charAt(i));
                }
                System.out.println();
            }
        }
        //方法2:synchronized直接写在方法名上即可(这样写的话,公共对象采用的就是23行new的对象)
        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:静态方法,采用类字节码作为公共对象
        public static synchronized void output3(String name) {
            int len = name.length();
            for (int i = 0; i < len; i++) {
                System.out.print(name.charAt(i));
            }
            System.out.println();
        }
    }
}

好了,简洁总结,深刻理解。有不对的地方,欢迎指出,在此谢过。

原文:—多线程:(一)线程同步

那时年少轻狂,把喜欢当做筹码,才敢肆无忌惮的任性。
—-那时年少轻狂

点赞