多线程-脏读

对于对象的同步、异步的方法,设计程序的时候一定要考虑问题的整体,出现数据不一致就是一个经典的错误。

1.demo

public class MyThread4 {
    private String user = "liudan";
    private String pwd = "123456";

    private synchronized void setUserValue(String user, String pwd) {
        this.user = user;
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.pwd = pwd;
        System.err.println("setValue 最终结果->:user = " + user + "\t" + "pwd = " + pwd);
    }

    private  void getUserValue() {
        System.err.println("getUserValue 设置值:user = " + this.user + "\t" + "pwd = " + this.pwd);
    }
    public  static  void main(String[] args) throws InterruptedException {
        final MyThread4 tUser = new MyThread4();

        Thread userThread = new Thread(new Runnable() {
            @Override
            public void run() {
                tUser.setUserValue("testuser","111111");
            }
        });
        userThread.start();
        Thread.sleep(1000);
        tUser.getUserValue();
    }
}

描述:set的方法加了 synchronized 关键字用到了同步,get方法获取没使用到 synchronized 关键字,最后到线程启动,线程一秒后,再次调用get方法,验证是否修可值。

运行结果:

    getUserValue 设置值:user = testuser pwd = 123456
    setValue 最终结果->:user = testuser pwd = 111111

1.先输出get、后输出set;线程启动后先修改了 user 然后休眠了2秒:

Thread.sleep(2000);

,然后马上

Thread.sleep(1000);这时的1秒有包含在2秒中,第1秒 get方法(无 synchronized )被调用了,第二秒才去调用set 方法。

2.demo
 private synchronized void getUserValue() {
        System.err.println("getUserValue 设置值:user = " + this.user + "\t" + "pwd = " + this.pwd);
    }

运行结果:

    setValue 最终结果->:user = testuser pwd = 111111

    getUserValue 设置值:user = testuser pwd = 111111

1.验证了锁的释放,保障数据的真实。

2.对一个方法枷加锁,需要考虑功能业务的整体性,同时为set、get加锁,使用 synchronized 关键字,保证业务的原子性,不然则会出现业务的错误。

 
时间: 2024-08-09 13:13:43

多线程-脏读的相关文章

004JAVA多线程脏读

package com.skcc.mthread; public class A_003DirtRead { private String username="zjy"; private String password="123456"; public A_003DirtRead() { // TODO Auto-generated constructor stub } public synchronized void setValue(String usernam

从头认识多线程-2.14 解决由同步的synchronized (newobject()) 引起的脏读的方法

这一章节我们来讨论一下解决由同步的synchronized (newobject()) 引起的脏读的方法. 1.造成上面脏读的原因:多线程多方法同时访问并修改某个属性域 2.解决思路 顺着上面的原因,笔者提出两种不是方法的方法 (1)只能单线程单方法访问并修改某个属性域这样就保证了执行的顺序(也就是需要同步所有访问并修改的步骤)(缺点:性能低下,优点:数据的强一致性) (2)在多线程多方法的情况下,只能够访问多个属性域,不能够同时访问并修改某一个单一的属性域(根本目的就是分开运算,但是,在生产环

java多线程,如何防止脏读数据

多线程容易“非线程安全”的情况,是由于用了全局变量,而又没有很好的控制起情况.所以无论做什么程序,谨慎使用全局变量 "非线程安全"其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏”读. 如以下代码就会出现“脏”读的情况: package com.ming.thread.t1; public class Count { int count=0; public void add(String str){ if("a".equals(str)

从头认识多线程-2.3 脏读(DirtyRead)

这一章节我们来讨论一下脏读(DirtyRead). 1.为什么出现脏读? 因为代码没有做同步,虽然set方法同步,但是由于get方法一般都会忘了,导致读的值是被写过的 2.代码清单 (1)由于程序没有同步,并且执行太快,导致脏读 package com.ray.deepintothread.ch02.topic_4; public class DirtyRead { public static void main(String[] args) throws InterruptedExceptio

从头认识多线程-2.13 由同步的synchronized (newobject()) 引起的异步现象和脏读

这一章节我们来讨论一下由同步的synchronized (newobject()) 引起的异步现象和脏读. 1.代码清单 package com.ray.deepintothread.ch02.topic_14; /** * * @author RayLee * */ public class AsynchOfSynchWithUnSameObject { public static void main(String[] args) throws InterruptedException { M

Java多线程之对写业务加锁,对读业务不加锁,会产生脏读

1 import java.util.concurrent.TimeUnit; 2 3 /** 4 * 对写业务加锁 5 * 对读业务不加锁 6 * 脏读 7 */ 8 public class Account { 9 10 String name; 11 double balance; 12 13 public synchronized void set(String name, double balance) { 14 this.name = name; 15 try { 16 Thread

Java多线程4:synchronized锁机制

脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的. 多线程线程安全问题示例 看一段代码: public class ThreadDomain13 { private int num = 0; public void addNum(String userName) { try { if ("a".equals(userName)) {

java多线程(四)

使用synchronized锁实现线程同步 为什么要用线程同步 我们先来看下这段代码的运行结果: Java学习交流群:495273252 在多线程上篇博客已经介绍过了,JVM采用的是抢占式调度模型,当一个线程sleep的时候,其它线程会抢占CPU资源.如果发生在数据库中,就是"脏读".synchronized锁就是用来解决这个问题的,多线程的线程同步机制实际上是靠锁的概念来控制的. 第一种方式:synchronized关键字修饰函数方法 Java学习交流群:495273252 第二种方

Java并发和多线程那些事儿

我记得我接触电脑的时候是在小学三年级的时候,那是1995年,那年发布了windows95,但是我学习的时候还是只是dos系统,简单对于文件的一些命令操作还有五笔 在过去的那个年代,电脑都是单CPU,也就是单任务处理:多任务处理到后来才慢慢发展起来,多任务代表电脑在同一时刻内可以处理很多并行操作,这样CPU被利用率高了,多个任务都可以共享.多任务处理的出现对于软件开发者来说需要做更多的事,就是资源释放,也就是垃圾回收,在软件不用的时候要释放资源,这样就可以给其他软件腾出资源来使用,就像ios内存机