`
luzl
  • 浏览: 572197 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

多线程 synchronized 保证正确读写

    博客分类:
  • Java
阅读更多
package scjp;

public class Demo712 implements Runnable{

	private int a;
	private int b;
	
	public int read() {
			return a+b;
	}
	
	public void set(int a,int b){
		this.a=a;
		this.b=b;
	}
	
	@Override
	public void run() {
		for(int i=0;i<10;i++){
			this.set(i, i);
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(i + " " + this.read());
		}
	}
	
	public static void main(String[] args) {
		Demo712 demo712=new Demo712();
		Thread t1=new Thread(demo712);
		Thread t2=new Thread(demo712);
		t1.start();
		t2.start();
	}

}



输出为:
0 0
0 2
1 2
1 4
2 4
2 6
3 6
3 8
4 8
4 10
5 10
5 12
6 12
6 14
7 14
7 16
8 16
8 18
9 18
9 18
其中
1 4
2 6
显然为不同步。如何给它们加上同步:
A.在方法read和set上都加 synchronized
public synchronized int read() {
			return a+b;
}
	
public synchronized void set(int a,int b){
		this.a=a;
		this.b=b;
}

B.给块加上synchronized
public int read() {
           synchronized(this){ 
		return a+b;
           }
}
	
public synchronized void set(int a,int b){
           synchronized(this){
		this.a=a;
		this.b=b;
           }
}



这两种做法都是可以的,输出结果我就不列了.下面讨论错误的情况:
public int read() {
           synchronized(a){ 
		return a+b;
           }
}
	
public synchronized void set(int a,int b){
           synchronized(b){
		this.a=a;
		this.b=b;
           }
}


这段代码有两个问题,第一synchronized的格式是这样的
synchronized(object){
//synchronized block
}

a,b是int型变量,int是primitive(int byte char boolean short long double float),它不是对象,所以编译会报错.要让这段编译通过得把a,b申明为Integer或者其它Object的类型.
第二,同步的变量只有a,需要a,b全部同步输出才正确,修正这个问题只有用前面的两种办法了,因为正如前面看到的synchronized也只能接受一个Object类型的参数.
1
0
分享到:
评论

相关推荐

    多线程通信读写文件

    特别是在处理大量数据时,如读写文件,多线程可以同时执行不同的任务,从而显著提高整体性能。本项目着重探讨如何在多线程环境中实现安全有效的文件读写操作。 首先,我们需要理解多线程的基本概念。在单核处理器...

    多线程对文件读写操作(java)

    Java提供了一些同步机制,如`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`java.util.concurrent`包下的工具类,这些都可以用来确保多线程访问文件时的数据一致性。 3. **使用BufferedReader和...

    一个多线程同步读写的小程序

    在这个“一个多线程同步读写的小程序”中,开发者显然已经考虑到了这些问题,并采取了相应的措施来确保程序的正确性和高效性。通过深入学习和实践这种技术,我们可以构建更健壮、更高效的多线程应用程序。

    多线程导入excel 数据

    在多线程环境下,可以利用POI的API处理工作簿、工作表和单元格,确保线程安全地读写数据。 - **OpenCSV**:虽然主要用于CSV文件,但在适当改造后,也可用于处理Excel数据。不过,处理复杂Excel格式时,POI更为合适...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...

    java多线程Demo

    在多线程环境下,如果一个变量被多个线程共享且只进行读写操作,可以使用volatile保证数据的一致性。 9. sleep(), yield(), interrupt(): - sleep()方法使当前线程暂停指定的时间,然后继续执行。 - yield()方法...

    File 线程读写

    在IT行业中,线程读写是多线程编程中的一个重要概念,特别是在处理文件操作时。当我们需要在多个线程中同时进行文件的读取和写入时,必须谨慎处理以防止数据冲突和不一致。本篇文章将深入探讨“File 线程读写”的...

    Android例子源码解决多线程读写sqlite数据库锁定问题

    如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.database.sqlite.SQLiteException: database is locked这样的异常。对于这样的问题,解决的办法就是keep single ...

    JAVAJAVA多线程教学演示系统论文

    系统可能包含了多种线程模型的示例,如生产者消费者模型、读写锁模型等,通过图形化界面展示线程间的交互,帮助学生直观地理解多线程的运行机制。 6. **系统性能与优化**:论文可能还分析了系统的性能特性,包括...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    多线程应用实例

    1. **线程安全**:如果一个方法在多线程环境下能正确运行,我们就说它是线程安全的。常见的线程安全问题包括数据竞争、活锁和死锁。 2. **线程不安全的示例**:多个线程同时修改全局变量可能导致数据错误,需要使用...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **同步机制**:包括`synchronized`关键字、`volatile`关键字、`Lock`接口及其子类,用于解决多线程环境中的数据一致性问题。 2. **并发控制** - **互斥与同步**:通过`synchronized`关键字实现临界区的互斥访问...

    java多线程文件传输

    Java多线程文件传输是Java编程中一个重要的实践领域,特别是在大数据处理、网络通信和分布式系统中。在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨...

    java多线程进度条

    为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    MulThreadSQLiteTest多线程操作数据库

    6. **性能优化**:在多线程环境下,合理规划读写操作的顺序和数量,以及使用索引优化查询,能显著提升数据库操作的效率。例如,避免在查询条件中使用未索引的列,以减少全表扫描。 在"MulThreadSQLiteTest"这个项目...

    多线程案例,多线程教程

    3. 数据库操作:在并发读写数据库时,多线程可以提高吞吐量,但需注意事务的隔离性和一致性。 总之,多线程是现代软件开发中不可或缺的技术,它能提高程序的性能和用户体验。理解并掌握多线程的概念、使用方法以及...

    多线程教程+实例讲解

    1. 文件读写:多线程可以提高文件读写的并发性,比如在处理大量文件时,每个线程处理一个文件。 2. 数据库操作:数据库连接通常昂贵且有限,多线程可以有效利用连接池,提高查询和更新速度。 3. Web服务器:多线程...

    多线程编程的简单实例

    线程优先级可以影响程序的执行顺序,而线程安全的数据结构(如线程安全的栈和队列)能保证在多线程环境中正确工作。 此外,死锁和饥饿是多线程编程中的两个常见问题,需要特别注意。死锁发生在两个或更多线程相互...

    iOS多线程Demo

    在iOS开发中,多线程是一项至关重要的技术,它能够帮助开发者实现应用程序的高效运行和流畅的用户体验。本文将深入探讨“iOS多线程Demo”所体现的核心知识点,并结合实际应用进行详细阐述。 首先,我们要了解多线程...

Global site tag (gtag.js) - Google Analytics