多线程2:线程操作共享数据所引发的问题

来源:互联网 发布:网络用语xp是什么意思 编辑:程序博客网 时间:2024/06/07 07:11

概述:多线程操作共享区域可能会引发线程安全问题,

方式1:没有操作共享数据线程类(不会存在线程安全问题)

package com.thread.n2;/** * Created by Zetting on 2017/5/30. * 没操作共享数据,不存在线程安全问题 */public class NotShareSafeMode extends Thread {    private int count = 5;    /**     * 初始化     * @param name     */    public NotShareSafeMode(String name){        super();        this.setName(name);    }    @Override    public void run(){        while(count > 0 ){            count -- ;            System.out.println(String.format("Thread %s ,the privale count is :%d",                    currentThread().getName(),count));        }    }    /**     * 测试类     * @param args     */    public static void main(String[] args){        /**         * 没有采用操作共享数据线程类         * 所有开启的线程数据都是相互独立的,所有不存在线程安全问题         * **/        NotShareSafeMode notNotShareSafeModeThreadA = new NotShareSafeMode("A");        NotShareSafeMode notNotShareSafeModeThreadB = new NotShareSafeMode("B");        NotShareSafeMode notNotShareSafeModeThreadC = new NotShareSafeMode("C");        NotShareSafeMode notNotShareSafeModeThreadD = new NotShareSafeMode("D");        notNotShareSafeModeThreadA.start();        notNotShareSafeModeThreadB.start();        notNotShareSafeModeThreadC.start();        notNotShareSafeModeThreadD.start();    }}

运行截图:这里写图片描述

方式2:操作共享数据线程类(存在线程安全问题)

package com.thread.n2;/** * Created by Zetting on 2017/5/30. * 有操作共享数据,但 存在线程问题 */public class ShareNotSafeMode extends Thread{    /**     * 采用操作共享数据线程类     */    private int count = 5;    @Override    public void run(){        try {            super.run();            count -- ;            Thread.sleep(500L);            System.out.println(String.format("Thread %s ,the privale count is :%d",                    currentThread().getName(), count));        } catch (InterruptedException e) {            e.printStackTrace();        }    }    /**     * 测试类     * @param args     */    public static void main(String[] args){        /**操作共享数据线程类**/        ShareNotSafeMode shareSafeMode =new ShareNotSafeMode();        Thread shareThreadA = new Thread(shareSafeMode,"A");        Thread shareThreadB = new Thread(shareSafeMode,"B");        Thread shareThreadC = new Thread(shareSafeMode,"C");        Thread shareThreadD = new Thread(shareSafeMode,"D");        Thread shareThreadE = new Thread(shareSafeMode,"E");        shareThreadA.start();        shareThreadB.start();        shareThreadC.start();        shareThreadD.start();        shareThreadE.start();    }}

运行截图:这里写图片描述

方式3:操作共享数据线程类(不存在线程安全问题)

package com.thread.n2;/** * Created by Zetting on 2017/5/30. * 有操作共享数据,但不存在线程安全问题 */public class ShareSafeMode extends Thread{    /**     * 采用操作共享数据线程类*     */    private int count = 5;    @Override   synchronized public void run(){        try {            super.run();            count -- ;            Thread.sleep(500L);            System.out.println(String.format("Thread %s ,the privale count is :%d",                    currentThread().getName(), count));        } catch (InterruptedException e) {            e.printStackTrace();        }    }    /**     * 测试类     * @param args     */    public static void main(String[] args){        /**操作共享数据线程类**/        ShareSafeMode shareSafeMode =new ShareSafeMode();        Thread shareThreadA = new Thread(shareSafeMode,"A");        Thread shareThreadB = new Thread(shareSafeMode,"B");        Thread shareThreadC = new Thread(shareSafeMode,"C");        Thread shareThreadD = new Thread(shareSafeMode,"D");        Thread shareThreadE = new Thread(shareSafeMode,"E");        shareThreadA.start();        shareThreadB.start();        shareThreadC.start();        shareThreadD.start();        shareThreadE.start();    }}

运行截图:
这里写图片描述

阅读全文
0 0
原创粉丝点击