`
oywl2008
  • 浏览: 1069085 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java synchronized详解

 
阅读更多

Java synchronized详解

第一篇:

使用synchronized

在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题。在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用。我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一个储蓄账户进行存款、取款操作的。
在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息。在主程序中我们首先生成了1000个线程,然后启动它们,每一个线程都对John的账户进行存100元,然后马上又取出100元。这样,对于John的账户来说,最终账户的余额应该是还是1000元才对。然而运行的结果却超出我们的想像,首先来看看我们的演示代码:

class Account {
    String name;
    
float amount;
    
    
    public Account(String name, 
float amount) {
        
this.name = name;
        
this.amount = amount;
    }

    public  
void deposit(float amt) {
        
float tmp = amount;
        tmp 
+= amt;
        
        
try {
            Thread.sleep(
100);//模拟其它处理所需要的时间,比如刷新数据库等
        } catch (InterruptedException e) {
            
// ignore
        }
        
        amount 
= tmp;
    }

    public  
void withdraw(float amt) {
        
float tmp = amount;
        tmp 
-= amt;

        
try {
            Thread.sleep(
100);//模拟其它处理所需要的时间,比如刷新数据库等
        } catch (InterruptedException e) {
            
// ignore
        }        

        amount 
= tmp;
    }

    public 
float getBalance() {
        
return amount;
    }
}



public class AccountTest{
    private static 
int NUM_OF_THREAD = 1000;
    static Thread[] threads 
= new Thread[NUM_OF_THREAD];
    
    public static 
void main(String[] args){
        final Account acc 
= new Account("John"1000.0f);
        
for (int i = 0; i< NUM_OF_THREAD; i++) {
            threads[i] 
= new Thread(new Runnable() {
                public 
void run() {
                        acc.deposit(
100.0f);
                        acc.withdraw(
100.0f);
                }
            });
            threads[i].start();
        }

        
for (int i=0; i<NUM_OF_THREAD; i++){
            
try {
                threads[i].join(); 
//等待所有线程运行结束
            } catch (InterruptedException e) {
                
// ignore
            }
        }
        System.out.println(
"Finally, John's balance is:" + acc.getBalance());
    }

}


注意,上面在Account的deposit和withdraw方法中之所以要把对amount的运算使用一个临时变量首先存储,sleep一段时间,然后,再赋值给amount,是为了模拟真实运行时的情况。因为在真实系统中,账户信息肯定是存储在持久媒介中,比如RDBMS中,此处的睡眠的时间相当于比较耗时的数据库操作,最后把临时变量tmp的值赋值给amount相当于把amount的改动写入数据库中。运行AccountTest,结果如下(每一次结果都会不同):

E:\java\exer\bin>java AccountTest
Finally, John's balance is:3900.0

E:\java\exer\bin>java AccountTest
Finally, John's balance is:4900.0

E:\java\exer\bin>java AccountTest
Finally, John's balance is:4700.0

E:\java\exer\bin>java AccountTest
Finally, John's balance is:3900.0

E:\java\exer\bin>java AccountTest
Finally, John's balance is:3900.0

E:\java\exer\bin>java AccountTest
Finally, John's balance is:5200.0

为什么会出现这样的问题?这就是多线程中的同步的问题。在我们的程序中,Account中的amount会同时被多个线程所访问,这就是一个竞争资源,通常称作竞态条件。对于这样的多个线程共享的资源我们必须进行同步,以避免一个线程的改动被另一个线程所覆盖。在我们这个程序中,Account中的amount是一个竞态条件,所以所有对amount的修改访问都要进行同步,我们将deposit()和withdraw()方法进行同步,修改为:

 

 

 


http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html

 

 

 

分享到:
评论

相关推荐

    java synchronized详解

    java synchronized详解

    JAVA synchronized详解

    ### JAVA synchronized详解 在Java编程语言中,`synchronized`是一个非常重要的关键字,它主要用于实现同步控制机制。通过使用`synchronized`,可以确保同一时刻只有一个线程能够访问被标记为同步的方法或代码块,...

    javasynchronized详解.pdf

    Java中的`synchronized`关键字是用于实现线程同步的重要机制,它的主要目的是确保在多线程环境中,对于共享资源的访问能够保持线程安全。当`synchronized`关键字应用于方法或代码块时,它提供了互斥访问,即在任意...

    Java synchronized 详解.docx

    Java中的`synchronized`关键字是用来解决多线程环境下的并发访问问题,确保共享资源在同一时间只能被一个线程访问,从而避免数据的不一致性。在Java中,`synchronized`可以应用于方法或者代码块,实现线程同步。 1....

    Java-synchronized详解.docx

    Java synchronized 详解 Java 中的同步机制是多线程编程中最重要的概念之一。它允许开发者控制多个线程对共享资源的访问,以避免数据不一致和race condition。这篇文章将详细介绍 Java 中的 synchronized 机制,...

    java_synchronized详解

    ### Java synchronized 关键字详解 #### 一、synchronized关键字简介 `synchronized`是Java语言提供的关键字之一,用于实现线程间的同步控制。通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个...

    java关键字Synchronized详解

    Java中的`synchronized`关键字是实现线程同步的关键机制,它保证了在多线程环境下,对共享资源的访问是互斥的,防止了数据竞争和不一致的问题。synchronized通过锁的概念来控制对代码块或方法的访问,分为两种形式:...

    java中synchronized用法

    "Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...

    java-synchronized详解.doc

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。本文将深入解析`synchronized`在Java中的应用和工作原理。 一、`synchronized`的基本用法 `...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    "Java 多线程与并发(4-26)-关键字- synchronized详解" Java 多线程与并发中的 synchronized 关键字是实现同步块的互斥访问和线程的阻塞及唤醒等工作的重要工具。下面将对 synchronized 关键字进行详细分析。 ...

    java里面synchronized用法.doc

    Java 中的 synchronized 用法详解 Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized ...

    Java中的关键字synchronized 详解

    Java中的关键字synchronized 详解 Java中的关键字synchronized是Java语言中用于线程同步的关键字。它可以修饰方法或代码块,以便在多线程环境中保护共享资源的安全。 1、修饰普通方法 synchronized关键字可以修饰...

    最新Java 编程详解

    5. **多线程**:Java提供了Thread类和Runnable接口来实现并发,还有同步机制如synchronized关键字,wait()、notify()和notifyAll()方法,以及线程池(ExecutorService)。 6. **网络编程**:Socket编程用于创建...

    并发synchronized详解.pdf

    并发synchronized详解 在 Java 中,synchronized 是一种非常重要的关键字,用于解决多线程编程中的线程安全问题。线程安全问题是指多个线程同时访问同一个共享、可变资源时可能出现的错误或不一致情况。为了解决这...

    java编程详解.pdf

    根据提供的信息,《java编程详解》是一本被广泛推荐并深受读者喜爱的专业书籍,它旨在为初学者和进阶学习者提供全面、深入的Java编程知识。以下是对该书可能涵盖的一些核心知识点的概述: ### Java语言基础 1. **...

    java锁详解.pdf

    Java 锁详解 Java 锁是 Java 并发编程中的一种基本机制,用于确保线程安全和避免竞争条件。Java 锁可以分为两大类:synchronized 锁和 ReentrantLock 锁。 一、Synchronized 锁 1. 锁的原理:synchronized 锁是...

    Java 同步锁(synchronized)详解及实例

    Java中的同步锁,即`synchronized`关键字,是Java多线程编程中用于解决并发问题的重要机制。它确保了对共享资源的互斥访问,防止数据的不一致性。当我们有多线程环境并涉及到共享数据时,可能会出现竞态条件,就像...

    Java线程详解大全

    Java提供了多种同步机制,如`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`Lock`接口(如`ReentrantLock`)等。通过这些机制,可以控制线程的执行顺序,确保数据的一致性和正确性。 线程组...

Global site tag (gtag.js) - Google Analytics