`
Mr_mai
  • 浏览: 7743 次
  • 性别: Icon_minigender_2
  • 来自: 温州
最近访客 更多访客>>
社区版块
存档分类
最新评论

线程同步

阅读更多

 

 

1、线程是什么,线程是一份独立运行的程序,有自己专用的运行空间,有可能和其他线程共享一些资源,比如,内存,文件,数据库等。

2、线程同步的概念。当多个线程共同占用一个资源的时候,这时候就要用到线程同步这个概念。线程同步的“同”字可能会让很多人误解,往往会被理解成几个线程一起进行,其实“同”的真正解释是指协同、协助、互相配合。比如说厕所,一个厕所同时只能给一个人占用,当一个人进去的时候,其他人就要在外面等待,里面的人出来以后外面的人才能够进去使用。   再来说说为什么需要线程同步, 最好的例子就是银行的账户,假设你在银行开了一个账户,Account,同时拿到一本存折还有一张银行卡,假设你的银行卡里面有3000大洋。有一天,你和你的女朋友分别拿着银行卡和存折同时在ATM取款机还有银行柜台取钱。两种方式两个线程,共享Account这个账户,假使你用银行卡取钱的时候线程1在操作Account,取出3000,但是在ATM吐出钱而Account还没有扣钱的时候,线程2又启动了,因为线程2并不知道线程1已经取了3000,你的女朋友在柜台又取了3000,这样银行岂不是亏了3000?

 

 public getCash(Account ac, String name, int cash) { 
 this.ac = ac;
 this.cash = cash;
 this.name = name;
 }


 public void run() {
 // synchronized (ac) { 
 int count = ac.getCash(cash);
 System.out.println(name + "取了" + count);
   // } 
} 


public Account(int num){
      this.total=num;
 } 


public int getCash(int cash){
 if(cash>total){
    return -1;
    } 
  else{
     disSave(cash);
      return cash; 
   }
 }

 

public static void main(String arg[]) throws Exception{
 Account ac=new Account(3000); 
 getCash thread1=new getCash(ac,"ATM",3000);
 getCash thread2=new getCash(ac,"柜台",3000); 
 thread1.start(); 
 thread2.start();
 Thread.sleep(5000);
 System.out.println(ac);
 }

 

  运行结果:柜台取了3000 ATM取了3000 总共还有金额:-3000  

 

3、然后我们看一下怎么样才能实现线程的同步。  

 (1)关键字synchronized,我们可以在我们需要共享的资源上加锁,这样就可以保证该对象只能被一个用户使用。     

 a、synchronized 锁定一个独立的代码块  

 

    public void run(){

  while(true){

  synchronized(lock){

  ...... //共享资源

  }

 }

}

     上诉代码可以理解为每当执行while里面代码时,共享资源就会被锁定,执行完以后释放锁。  

 

    b、synchronized 关键字还可以修饰一个函数   

         //取钱,够的话扣除然后返回要扣除的钱的总数不够的话返回-1

    public synchronized int getCash(int cash){ 

       if(cash>total){

            return -1;

         } else{

        disSave(cash);

        return cash; 

     }

   }

 

   同理当使用上面的函数的时候这个函数就会被锁定。

 

PS:   需要注意的就是synchronized(Lock)里面的Lock必须是公共锁。假如我在Thread1中创建了一个锁lock1,在Thread2也创建了一个锁lock2,那么“上锁”也就没意义了。就好像一个公共教室,我进门锁了门,但是另一个人开了后门从后门进,我锁没锁前门也就没有意义了。   

2、看下述代码

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

 

      public void methodA() {

         synchronized(lock) {

            …

           }

        }

       使用这种方式生成锁可以称作大神级别的作品,后来查找了下原因,因为生成零长度的byte[]对象只需3条操作码,而Object lock= new Object()则需要7行操作码,所以生成byte[0]是最经济的一种方式。

 

(2)使用同步锁Lock。Java中有一个包java.util.concurrrent.locks.Lock接口。   具体的使用方法是:

  //先生成一个公共锁。   

       Java.util.concurrent.Lock lock=new java.util.concurrrent.locks.Lock.ReentrantLock();

  lock.lock();

       //开始上锁

  try{

      doSomeThing. //共享资源

  }

  finally{

  lock.unlock();

  }

 

       synchronized和lock相同与不同: 凡是synchronized能实现的效果lock都是可以实现的,不同的是,lock锁定后执行的内容必须放在try里面,而解锁的unlock必须放finally里面。 当然,同步是要很大的系统开销作为代价的,有时候可能会导致死锁,因此要避免无谓的同步。

分享到:
评论

相关推荐

    vc++中的线程锁(线程锁保持线程同步)

    在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...

    C#线程同步的几种方法

    标题与描述概述的知识点主要集中在C#中的线程同步技术,包括`volatile`关键字、`lock`关键字以及`System.Threading.Interlocked`类的使用。在深入探讨这些知识点之前,我们首先需要理解为什么线程同步在多线程环境中...

    操作系统线程同步实验报告

    操作系统线程同步是多线程编程中的核心概念,旨在确保并发执行的线程在访问共享资源时不会引发数据不一致性和竞态条件。本实验报告详细探讨了这一主题,通过一个简单的银行账户转账的示例来揭示临界区问题及其解决...

    线程同步的四种方式

    在多线程编程中,线程同步是一种控制多个线程并发执行时访问共享资源的方式,以避免数据不一致和死锁等问题。以下是对线程同步的四种主要方式的详细解释: 1. **事件(Event)** 事件是Windows API提供的一种线程...

    线程同步解决火车站售票问题

    在这个“线程同步解决火车站售票问题”的例子中,我们可以通过线程同步机制来实现售票的有序、无冲突的过程。 首先,我们需要理解问题的核心:10个售票处(线程)需要共享1000张票(资源),并且每卖出一张票,必须...

    操作系统实验多线程同步(含C++源代码)

    操作系统中的多线程同步是一个关键概念,特别是在并发编程中,它涉及到如何协调多个线程以避免数据不一致性和竞态条件。在这个实验中,我们关注的是C++编程语言中的实现,以及操作系统如何处理线程的优先级。 首先...

    VC++线程同步实例

    在编程领域,线程同步是多线程编程中的一个重要概念,它确保了多个线程在访问共享资源时的正确性和一致性。在这个“VC++线程同步实例”中,我们将探讨如何利用VC++(Visual C++)来实现线程间的同步,以避免数据竞争...

    简单实现多线程同步示例(模拟购票系统)

    本示例“简单实现多线程同步示例(模拟购票系统)”旨在通过一个具体的实例,帮助开发者理解如何在Java中创建并管理多线程以及如何实现线程同步,确保数据的一致性和正确性。 首先,我们要明确多线程的基本概念。在...

    操作系统线程同步算法

    操作系统中的线程同步是多线程编程中一个关键的概念,它确保了多个线程在访问共享资源时的正确性,防止数据竞争和其他并发问题。在Windows操作系统中,提供了多种线程同步机制,如临界区、事件、信号量以及互斥量等...

    Delphi多线程同步的例子

    本文将深入探讨Delphi中的多线程和线程同步,并以"SortThreads"和"delphi-thread-gui"这两个示例项目为例,讲解如何在实践中应用这些概念。 1. **多线程**:多线程允许应用程序同时执行多个独立的任务,提高程序的...

    多线程及线程同步

    然而,多线程环境下也带来了一些问题,尤其是资源竞争和数据一致性问题,这些问题需要通过线程同步机制来解决。本文将详细介绍如何通过临界区、互斥内核对象、事件内核对象和信号量内核对象来实现线程同步。 1. ...

    Java多线程同步.pdf

    "Java多线程同步.pdf" Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用...

    线程同步小例子

    在编程领域,线程同步是多线程编程中的一个核心概念,它涉及到如何有效地管理和协调多个并发执行的线程,确保它们能正确地共享资源,避免数据竞争和死锁等问题。这个“线程同步小例子”是基于孙鑫先生著作中的示例...

    操作系统实验 多线程同步与互斥 java编写 有界面

    操作系统实验是计算机科学教育中的重要组成部分,它帮助学生理解和掌握操作系统的基本原理,特别是多线程同步与互斥的概念。在Java编程环境下,这些概念可以通过实际的代码实现来深入理解。 多线程是现代操作系统中...

    多线程的批量线程同步解决方案

    "多线程的批量线程同步解决方案"这个标题暗示我们探讨的是如何在多线程环境下有效地管理和同步多个任务,确保数据一致性与程序正确性。下面将详细阐述相关知识点。 一、多线程基础 多线程是指在一个进程中同时执行...

    Jni多线程同步事例

    在本例“Jni多线程同步事例”中,我们将探讨如何在JNI层面上实现多线程同步,特别是在一个生产者-消费者模型的场景下。 生产者-消费者模型是一种经典的并发问题,它涉及到两个或多个线程之间的协作。在该模型中,...

    c#线程同步的典型例子

    C#线程同步是多线程编程中的一个重要概念,它涉及到如何控制多个线程对共享资源的访问,以避免数据不一致性和竞态条件。在C#中,线程同步通常用于确保在某一时刻只有一个线程可以访问特定的代码块或资源,从而保证...

    使用三种VC的多线程同步方法编写一个多线程的程序

    1.使用三种VC的多线程同步方法编写一个多线程的程序(要求在屏幕上先显示Hello,再显示World)。 1)基于全局变量的多线程同步程序; 2)基于事件的多线程同步程序; 3)基于临界区的多线程同步程序。

Global site tag (gtag.js) - Google Analytics