0 0

java多线程同步问题5

public class Number implements Runnable{
	
	private Integer count=1;

	@Override
	public void run() {
		while(true){
			synchronized (count) {
				if(count>30){
					break;
				}
				try {
					Thread.sleep(200);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(count+"-----------");
				count++;
				System.out.println(count);
			}
		}
	}
	
	public static void main(String[] args) {
		Number n = new Number();
		
		Thread t1=  new Thread(n,"Number1");
		Thread t2=  new Thread(n,"Number2");
		Thread t3=  new Thread(n,"Number3");
		
		t1.start();
		t2.start();
		t3.start();
	}
	
}

这段线程可能会打印如下:
1-----------
2
2-----------
3
3-----------
4
4-----------
4-----------
4-----------
6
5
7
7-----------
8
8-----------
9
9-----------
10
10-----------
10-----------
11
12
12-----------
13
13-----------
14
13-----------
15
15-----------
16
16-----------
17
17-----------
18
18-----------
19
19-----------
20
20-----------
21
21-----------
22
22-----------
23
23-----------
24
24-----------
25
25-----------
26
26-----------
27
27-----------
28
28-----------
29
29-----------
30
30-----------
31
31-----------
32
31-----------
33

感觉好像没有同步,有几个打印的是一样,比如4---------

如果把synchronized (count)   改为synchronized (this) 就是可以的

这个不清楚为什么,有能解释的吗?

 

2014年7月08日 10:45

6个答案 按时间排序 按投票排序

0 0

采纳的答案

因为count++;后,count不再是一开始的对象,因此某些时间,不同的线程hold了不同的count。

2014年7月08日 12:15
0 0

我一直都是这么写的,感觉应该没是错误.

public class Number extends Thread {
	
	private static int i = 0;
	
	public synchronized int get(){
		return i++;
	}
	
	public void run(){
		while(true){
			int a = get();
			if(a>30){
				break;
			}
			System.out.println(Thread.currentThread().getName()+":"+a);
		}
	}
	
	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			new Thread(new Number()).start();
		}
	}
	
}

2014年7月09日 16:13
0 0

	
	private byte[] lock = new byte[0];

	private  Integer count = 1;

	@Override
	public void run() {
		while (true) {
			if (count > 30) {
				break;
			}
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (lock) {
				System.out.println(count + "-----------");
				count = count + 1;
				System.out.println(count);

			}
		}
	}

一般这样写,锁对象要小,锁内容只和变量控制相关

2014年7月09日 13:39
0 0

的确是count的原因。
当第一个线程进入run领域时,在局部作用域会出现一个局部的count引用指向count对象,此时全世界有两个引用指向count,一个是顶端的count,一个是局部的。然后第一个线程执行完count++后,产生一个新的count对象,并且将顶端的引用切换到了这个新的未被锁定的对象,于是第二个线程就鱼贯而入。此时就出现了两个线程在run中,最终造成了混乱。

2014年7月09日 01:11
0 0

在java里 , 只有常量才能 ++ , 如 :int  i = 0 ; i++;
那为什么 Integer 的对象也可以 ++ 呢?
这其实是编译器帮你干的事情.
Integer i = 0 ;
i ++;

相当于
int _i = 0;
Integer i = new Integer(_i);
i = new Integer (_i++);

然后你应该知道 为什么你得同步失败了吧?

2014年7月08日 19:00
0 0

count++ count被赋予了新的对象,那你加锁的这个对象不固定,当然线程是不安全的了

2014年7月08日 14:44

相关推荐

    Java多线程同步问题的探究.pdf

    在探究Java多线程同步问题时,需要关注的关键知识点包括synchronized关键字的使用、JDK 5引入的java.util.concurrent.locks包下的锁机制、以及JDK 1.2中ThreadLocal类的使用。此外,了解JVM(Java虚拟机)在处理多...

    Java多线程同步问题分析.pdf

    Java多线程同步问题分析主要关注的是在并发环境中如何有效地管理共享资源,避免出现数据竞争和不一致性。在Java编程中,多线程是提升程序性能的重要手段,尤其是在服务器端应用和服务中。然而,当多个线程同时访问并...

    Java多线程同步.pdf

    因此,在使用Java多线程同步机制时,需要小心避免这些问题的出现。 Java多线程同步机制在实际应用中的应用 Java多线程同步机制在实际应用中有很多应用,例如: * 在线银行系统中,使用Java多线程同步机制来确保...

    以银行取钱为例模拟Java多线程同步问题完整代码

    Java 多线程同步问题完整代码 本文主要介绍了Java 多线程同步问题完整代码,以银行取钱为例,通过代码实例来演示多线程同步问题的解决方案。多线程同步是指在同一程序中有多个顺序流在执行,并且这些顺序流之间需要...

    Java多线程同步机制研究分析.pdf

    本文通过对Java多线程同步机制的研究和分析,旨在解决多线程中的同步问题和共享资源的访问保护问题。 一、Java多线程同步机制的重要性 Java多线程同步机制是Java编程语言中的一种机制,它允许多个线程同时执行,...

    java多线程同步例子

    java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料

    基于Java多线程同步的安全性研究.pdf

    本文主要研究了基于Java多线程同步的安全性问题,讨论了Java多线程同步机制的实现方法和安全性问题的解决方法。文章首先介绍了Java多线程同步的必要性和重要性,然后讨论了Java多线程同步机制的实现方法,包括使用...

    java 多线程同步

    Java多线程同步是Java编程中关键的并发概念,它涉及到如何在多个线程访问共享资源时保持数据的一致性和完整性。`java.util.concurrent`包是Java提供的一个强大的并发工具库,它为开发者提供了多种线程安全的工具,...

    Java多线程同步论文.doc

    Java多线程同步是Java编程中至关重要的一部分,特别是在并发编程领域。Java提供了多种同步机制来确保线程安全,防止数据不一致性和竞态条件。在Java中,synchronized关键字是实现线程同步的关键,它提供了互斥访问,...

    Java多线程同步机制的应用分析.pdf

    在实际应用中,Java多线程同步机制可以用于解决多种问题,例如售票系统、银行系统等。通过使用同步机制,可以避免多线程之间的冲突和错误,提高系统的安全性和可靠性。 多线程编程的优点是可以提高系统的性能和效率...

    基于Java多线程同步技术的简易模拟售票系统实现.pdf

    根据给定文件的信息,本篇文档是关于Java多线程同步技术在简易模拟售票系统...通过一个简易的售票系统案例,本文档展示了如何将理论知识应用于实际问题的解决中,对于学习和理解Java多线程同步技术具有重要的参考价值。

    Java多线程同步具体实例讲解 .doc

    Java多线程同步是编程中一个非常重要的概念,特别是在并发编程和高并发系统设计中起到关键作用。在Java中,为了保证线程安全,避免数据竞争和不一致的状态,我们通常会使用同步机制来控制对共享资源的访问。本文将...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    Java多线程同步具体实例.doc

    Java多线程同步是编程中一个非常重要的概念,特别是在并发编程中,用于解决多个线程访问共享资源时可能引发的数据不一致问题。本实例通过一个简单的火车票售票系统来演示同步机制的应用。 在这个实例中,我们创建了...

    java 多线程同步方法的实例

    现在,我们来看一个具体的实例——银行账户转账操作,这是一个典型的多线程同步问题。假设我们有如下类: ```java public class Account { private double balance; public synchronized void deposit(double ...

    JAVA实现线程间同步与互斥生产者消费者问题

    在Java编程中,线程同步和互斥是多线程编程中的重要概念,它们用于解决多个线程同时访问共享资源时可能出现的问题。本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费...

    java多线程经典案例

    本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    Java多线程同步机制在售票系统的实现

    ### Java多线程同步机制在售票系统的实现 #### 一、引言 随着计算机硬件的发展,多核处理器已经成为主流配置,这为多线程编程提供了更广阔的应用场景。多线程能够充分利用多核处理器的优势,提高程序的并发性和...

Global site tag (gtag.js) - Google Analytics