`
wen303614
  • 浏览: 8121 次
社区版块
存档分类
最新评论

线程脏读

阅读更多

 

 脏读

  对于对象的同步和异步方法,我们在设计自己的程序的时候,一定要考虑问题的整体性,不然会出现数据不一致的错误,很经典的错误就是脏读(dirtyRead)

 

public class DirtyRead {

	private String username = "bjsxt";
	private String password = "123";
	
	public synchronized void setValue(String username, String password){
		this.username = username;
		
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		this.password = password;
		
		System.out.println("setValue最终结果:username = " + username + " , password = " + password);
	}
	
	public void getValue(){
		System.out.println("getValue方法得到:username = " + this.username + " , password = " + this.password);
	}
	
	
	public static void main(String[] args) throws Exception{
		
		final DirtyRead dr = new DirtyRead();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				dr.setValue("z3", "456");		
			}
		});
		t1.start();
		Thread.sleep(1000);
		
		dr.getValue();
	}
结果:
getValue方法得到:username = z3 , password = 123
setValue最终结果:username = z3 , password = 456

 结果分析: 预计需要的结果是username = z3 , password = 456 但是没有,为了保持业务的原子性,setValue时不需要getValue,需要在getValue方法上加上synchronized关键字,不然会出现业务错误

分享到:
评论

相关推荐

    java实现基于MVC的线上图书购买系统

    后,即可购买图书 ,此时个人图书基金也会减少,修改图书数量信息,(对了为了保证图书数量以及用户的购买基金不会出现线程脏读,还加了一点线程),用户信息也实现就不多说。 作为刚刚接触MVC模式的java开发学习者...

    ThreadSwitch_滴水_threadswitch_线程切换_

    线程不安全的代码可能导致数据竞争、脏读等问题。开发人员应确保对共享资源的操作是线程安全的。 10. **性能优化**:过度的线程切换会降低系统效率,因此合理设计线程数量、有效利用线程池、减少不必要的同步开销是...

    java线程api学习文档

    - `volatile`关键字:确保多线程环境下变量的可见性和有序性,防止数据的脏读。 5. **高级并发工具**: - `ExecutorService`和`ThreadPoolExecutor`: 提供线程池管理,可以有效地重用已创建的线程,减少创建和...

    多线程模型

    需要确保每个线程的事务独立,并避免脏读、不可重复读和幻读等问题。可以采用各种事务隔离级别,如读未提交、读已提交、可重复读和串行化。 5. **锁和同步机制**:在访问共享资源(如数据库连接)时,需要使用锁或...

    java 多线程数据库操作

    - **事务管理**:多线程可能会引发并发控制问题,比如脏读、不可重复读和幻读。使用数据库提供的事务机制(如ACID属性)和隔离级别可以避免这些问题。 - **数据库连接管理**:由于数据库连接是有限的资源,应使用...

    J2ME的多线程教程和测试

    共享数据的访问需要同步,避免脏读和不可重复读。此外,避免死锁(两个或更多线程相互等待对方释放资源而无法继续执行)也很关键。 七、示例 在`aThreadTest`这个示例中,很可能是创建了一个线程类,模拟了多线程...

    多线程对数据库操作

    此外,如果多个线程需要访问同一份数据,应使用适当的同步策略,如`synchronized`关键字,避免脏读、不可重复读和幻读等并发问题。 **5. 端口配置** 在描述中提到要修改线程端口,这可能是指Java程序中用于监听...

    java线程入门,java线程入门

    - **volatile关键字**:保证共享变量的可见性和有序性,避免线程间的脏读。 - **Lock接口与ReentrantLock**:提供比synchronized更灵活的锁机制,支持公平锁、非公平锁以及可重入锁。 5. **线程通信**: - **...

    java_Thread.rar_java 多线程_java多线程

    在实际开发中,还需要考虑线程安全问题,例如避免脏读、幻读和不可重复读等并发问题。Java提供了一系列的并发工具类,如Atomic系列、ConcurrentHashMap、ConcurrentLinkedQueue等,帮助开发者编写高效、安全的多线程...

    张孝祥Java多线程与并发库高级应用视频教程练习代码

    3. `volatile`关键字:用于确保共享变量的可见性和有序性,避免数据的脏读。但要注意,它并不保证原子性。 4. `ReentrantLock`:可重入锁,提供了比`synchronized`更细粒度的锁控制,支持公平锁和非公平锁,以及锁...

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义

    2. **volatile**:`volatile`关键字可保证变量的可见性和有序性,防止线程间的脏读和乱序执行。 3. **原子操作类(java.util.concurrent.atomic)**:提供了一组原子操作的类,如AtomicInteger、AtomicLong等,它们...

    18.线程的同步机制-synchronized同步方法-脏读.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java多线程设计

    另外,`volatile`关键字确保变量在多线程环境下的可见性,防止线程间的脏读问题。 `java.util.concurrent`包提供了更高级的线程管理和同步工具,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)、`...

    java线程安全以及生产者消费者demo

    `volatile`则保证了变量在所有线程间具有可见性,防止数据的脏读。 2. **原子操作**:Java的`java.util.concurrent.atomic`包提供了一系列原子类,如`AtomicInteger`,它们支持原子性的读/修改/写操作,避免了线程...

    VC多线程操作ORACLE数据库

    此外,事务管理也至关重要,通过设置合适的事务隔离级别,可以避免脏读、不可重复读和幻读等并发问题。 为了实现线程同步,VC++提供了多种同步机制,如临界区、事件、信号量等。例如,可以使用临界区来保护共享的...

    线程编程练习笔记

    2. volatile关键字:确保线程间的变量可见性,防止编译器优化导致的脏读问题。 3. yield return:在迭代器中使用,可以让其他线程有机会执行。 十、异步编程与Task类 .NET Framework 4.0引入了Task类,作为异步编程...

    java线程安全总结

    2. **脏读问题**:如果线程A更新了`balance`值,但还没有写回主内存,此时线程B读取到了旧的`balance`值,就会导致脏读现象。 **5.2 解决方案** 为了解决上述问题,可以采用以下几种方法: 1. **使用volatile...

    Servlet线程同步计数器实验

    这将展示并发访问共享资源时可能出现的问题,如丢失更新、脏读等。 3. **引入线程同步**:然后,在Servlet的service()方法或doGet()、doPost()等方法中使用synchronized关键字,将计数器的增操作封装在同步块内,...

    Java并发理论,如何理解线程安全.docx

    1. **数据可见性**:线程A更新的共享变量可能未及时写回主内存,线程B可能读取到旧值,造成脏读。 2. **重排序**:编译器和处理器为了优化性能可能会重新排序指令,但在多线程环境中可能导致错误的结果。 3. **原子...

    Java多线程与线程安全实践-基于Http协议的断点续传.rar

    在多线程环境中使用SQL,需要注意数据库事务的隔离级别和并发控制,防止脏读、不可重复读或幻读等问题。可以使用Java的JDBC API进行数据库连接和操作,同时使用预编译的`PreparedStatement`来防止SQL注入。 总的来...

Global site tag (gtag.js) - Google Analytics