博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程学习笔记(二)
阅读量:5787 次
发布时间:2019-06-18

本文共 4466 字,大约阅读时间需要 14 分钟。

hot3.png

自定义线程类中的实例变量针对其他线程有共享和不共享两种

一 .  不共享数据

       创建测试类:

public class MyThread extends Thread {            private int count = 10;            public MyThread(String name){                super();                this.setName(name);            }            @Override            public void run() {                super.run();                while (count > 0){                    count--;                    System.out.println(this.currentThread().getName() + "count-- : " + count );                }            }        }

        调用:     

public class Test {            public static void main(String[] args) {                try {                    MyThread first = new MyThread("first");                    MyThread second = new MyThread("second");                    MyThread third = new MyThread("third");                    first.start();                    second.start();                    third.start();                } catch (Exception e) {                    e.printStackTrace();                }            }        }

        运行结果:

        

二 . 共享数据

        创建线程类: 

public class MyThread extends Thread {            private int count = 10;            @Override            public void run() {                super.run();                count--;                System.out.println(this.currentThread().getName() + "count-- : " + count);            }        }

        创建测试类:

public class Test {            public static void main(String[] args) {                try {                    MyThread myThread = new MyThread();                    Thread first = new Thread(myThread,"first");                    Thread second = new Thread(myThread,"second");                    Thread third = new Thread(myThread,"third");                    first.start();                    second.start();                    third.start();                } catch (Exception e) {                    e.printStackTrace();                }            }        }

        运行结果:

    

        

三 . 非线程安全:

      多个线程对同一个对象中的同一个实例变量进行操作时出现值被更改.值不同步的情况,进而影响程序执行流程.

public class UnSafeThread extends Thread{    private static String name;    private static String pswd;    public static void login(String userName,String userPswd){        try {            name = userName;            if(userName.equals("aaaa")){                Thread.sleep(5000);            }            pswd = userPswd;            System.out.println("userName = " + name + ", userPassword = " + pswd);        }catch (Exception e){            e.printStackTrace();        }    }}
public class ALogin extends Thread {    @Override    public void run(){        UnSafeThread.login("aaaa","aaaaaa");    }}
public class BLogin extends Thread {    @Override    public void run(){        UnSafeThread.login("bbbb","bbbbbb");    }}
public class Test {    public static void main(String[] args) {        ALogin aLogin = new ALogin();        aLogin.start();        BLogin bLogin = new BLogin();        bLogin.start();    }}

       运行结果:

        

 

解决非线程安全问题,还是会使用synchronized,将UnSafeThread类中的代码更改为

synchronized public class UnSafeThread extends Thread{    private static String name;    private static String pswd;    public static void login(String userName,String userPswd){        try {            name = userName;            if(userName.equals("aaaa")){                Thread.sleep(5000);            }            pswd = userPswd;            System.out.println("userName = " + name + ", userPassword = " + pswd);        }catch (Exception e){            e.printStackTrace();        }    }}

 

 

四 . i--与println()的异常

        创建测试类: 

public class MyThread extends Thread {    private int count = 10;    @Override    public void run() {        super.run();        System.out.println(this.currentThread().getName() + "count-- : " + count--);    }}

        运行类:

public class Test {    public static void main(String[] args) {        MyThread myThread = new MyThread();        Thread t1 = new Thread(myThread);        Thread t2 = new Thread(myThread);        Thread t3 = new Thread(myThread);        Thread t4 = new Thread(myThread);        Thread t5 = new Thread(myThread);        Thread t6 = new Thread(myThread);        Thread t7 = new Thread(myThread);        Thread t8 = new Thread(myThread);        Thread t9 = new Thread(myThread);        t1.start();        t2.start();        t3.start();        t4.start();        t5.start();        t6.start();        t7.start();        t8.start();        t9.start();    }}

       运行结果:

    

因为println()方法在内部进行了同步操作,但是i--的操作确实在进入println()之前进行操作,所以有发生非线程安全的问题,所以,为了防止发生非线程安全的问题,还是应使用同步方法.

 

 

转载于:https://my.oschina.net/scymore/blog/739237

你可能感兴趣的文章
VC中实现文字竖排的简单方法
查看>>
会话标识未更新
查看>>
阿里架构师:程序员必须掌握的几项核心技术能力
查看>>
程序员常用的六大技术博客类
查看>>
Iceworks 2.8.0 发布,自定义你的 React 模板
查看>>
胖哥学SpringMVC:请求方式转换过滤器配置
查看>>
Kotlin 更加优雅的 Builder - 理解 with
查看>>
前端日拱一卒D6——字符编码与浏览器解析
查看>>
深入理解浏览器的缓存机制
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
Hoshin Kanri在丰田的应用
查看>>
又拍云沈志华:如何打造一款安全的App
查看>>
克服大数据集群的挑战
查看>>
PostgreSQL并发控制(MVCC, 事务,事务隔离级别)
查看>>
DM***的第二阶段OSPF
查看>>
20180702搭建青岛RAC记录
查看>>
Spring Security OAuth 实现OAuth 2.0 授权
查看>>
linux文件及简单命令学习
查看>>
dubbo源码分析-架构
查看>>
新 Terraform 提供商: Oracle OCI, Brightbox, RightScale
查看>>