《Java多线程编程核心技术(第2版)》 —1.11.7 使用stop()释放锁给数据造成不一致的结果

举报
华章计算机 发表于 2020/02/08 15:21:42 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.11.7节,作者是高洪岩。

1.11.7 使用stop()释放锁给数据造成不一致的结果

对锁定的对象进行“解锁”,会导致数据得不到同步的处理,进而出现数据不一致的问题。本节将会讲解使用stop()释放锁给数据造成不一致性的结果,如果出现这样的情况,则程序处理的数据完全有可能遭到破坏,最终导致程序执行的流程是错误的,在此一定要注意。下面来看一个示例。

创建项目stopThrowLock,文件MyService.java代码如下:

package testpackage;

 

public class MyService {

 

    private String username = "a";

    private String password = "aa";

 

    synchronized public String getUsername() {

        return username;

    }

 

    synchronized public String getPassword() {

        return password;

    }

 

    synchronized public void printString(String username, String password) {

        try {

            this.username = username;

            Thread.sleep(100000000);

            this.password = password;

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

 

}

调用业务方法printString()的线程代码如下:

package testpackage;

 

public class MyThreadA extends Thread {

 

    private MyService object;

 

    public MyThreadA(MyService object) {

        super();

        this.object = object;

    }

 

    @Override

    public void run() {

        object.printString("b", "bb");

    }

}

输出username和password的线程代码如下:

package testpackage;

 

public class MyThreadB extends Thread {

 

    private MyService object;

 

    public MyThreadB(MyService object) {

        super();

        this.object = object;

    }

 

    @Override

    public void run() {

        System.out.println("username=" + object.getUsername());

        System.out.println("password=" + object.getPassword());

    }

}

文件Run.java代码如下:

package test.run;

 

import testpackage.MyService;

import testpackage.MyThreadA;

import testpackage.MyThreadB;

 

public class Run {

    public static void main(String[] args) {

        try {

            MyService object = new MyService();

            MyThreadA threadA = new MyThreadA(object);

            threadA.start();

            Thread.sleep(100);

            MyThreadB threadB = new MyThreadB(object);

            threadB.start();

            Thread.sleep(3000);

            threadA.stop();

            System.out.println("stop()执行后,在下方开始打印username和password。");

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

程序运行结果如图1-52所示。

 image.png

图1-52 强制停止线程造成数据不一致

由于stop()方法已经在JDK中被标明是“作废/过期”的方法,显然它在功能上具有缺陷,所以不建议在程序中使用stop()方法停止线程。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。