`
arctg30
  • 浏览: 17633 次
  • 来自: ...
社区版块
存档分类
最新评论
阅读更多

多线程同步方式

线程之间的同步需要用到“锁”来保护代码,以保证对于共享数据进行有序化读写。java中锁又分为独占锁和读写锁。独占锁是一种公平锁,任何时刻,最多只有一个线程(读或写)进入被保护的代码块;读写锁是一种非公平锁,包含了读锁和写锁,允许共享读,但读写互斥、写写互斥。在读多写少的场合使用读写锁比使用独占锁效率要高得多。

 

java多线程同步方式有四种:join,synchronized,wait/notify,ReadWriteLock。后面的三种机制都需要用到锁。

 

join

挂起当前线程,待其他线程执行完毕后再恢复当前线程,力度非常粗,只用于一些特定场合,比如后面的线程需要用到前面线程的处理结果。如下:

        (1)Thread test=new TestThread();

        (2)test.start();

        (3)test.join();

        (4)System.out.println("test");

第(3)步执行完毕后,当前线程挂起,等待test线程执行结束,然后当前线程恢复就绪,待时间片到来时执行第(4)步。

 

synchronized

synchronized是jdk原生的线程同步方案,实际上就是独占锁机制,java中所有的Object都有一个隐藏的锁,对于实例方法的保护,用当前对象作为锁,对于类方法则用类对象作为锁。如下:

public class Test{
    public synchronized void test1(){
       System.out.println("test1");
    }

    public synchronized static void test2(){
       System.out.println("test2");
    }
}

其中test1方法是实例方法,等价于

public void test1(){

       synchronized(this ){
           System.out.println("test1");

       }
}

test2方法是类方法,等价于

public static void test2(){

       synchronized(Test.class ){
          System.out.println("test2");

       }
}

另外synchronized还可以加到属性字段上,其实意思都差不多,在操作该属性时会自动地加上当前对象锁(实例属性)或类锁(类属性)。

 

wait/notify

wait/notify是在synchronized的基础上加入了等待/通知功能,使得线程间的同步更为灵活。但是在锁对象上,同步锁不再限于当前实例对象或类对象,可以使用任何非空对象,如下:

Object lock=new Object();
synchronized(lock){
     try {
               lock.wait(1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
      }
}

 

ReadWriteLock

从根本上讲,synchronized与wait/notify是一样的,都是基于独占锁,只不过后者在前者的基础上做了功能上的扩充。ReadWriteLock是一个更为强大的锁机制,因为他允许共享读,大大降低了读并发时的上锁消耗。客观地讲,与独占互斥锁定相比,使用读写锁定能否提升性能则取决于读写操作期间读取数据相对于修改数据的频率。实例代码如下:

ReadWriteLock rw=new ReentrantReadWriteLock();
Lock rl=rw.readLock();
Lock wl=rw.writeLock();
//读共享数据
rl.lock();
 try{
      /////////////
}finally{
        rl.unlock();
}
       
//写共享数据
wl.lock();
try{
     //////////////
}finally{
    wl.unlock();
}

 

分享到:
评论

相关推荐

    java 线程同步 信号量控制同步

    Java 线程同步控制机制 线程同步是 Java 编程中的一种机制,用于控制多个线程之间的资源访问顺序,以避免线程之间的冲突和数据不一致。线程同步的目的就是避免线程“同步”执行,即让多个线程之间排队操作共享资源...

    java线程同步详解

    总结一下,Java线程同步的关键点: 1. **线程同步是为了解决共享资源的并发访问问题,防止数据不一致和冲突。** 2. **同步意味着线程排队,依次访问共享资源,而不是同时访问。** 3. **只有共享变量(可变状态)才...

    Java 线程同步调用

    在深入探讨Java线程同步调用这一主题之前,我们首先需要理解线程同步的基本概念及其在多线程环境中的重要性。线程同步是多线程编程中的一个关键概念,它确保了多个线程在访问共享资源时不会发生冲突,避免了数据不...

    java线程同步及通信

    Java线程同步与通信是多线程编程中的关键概念,用于解决并发访问共享资源时可能出现的数据不一致性和竞态条件问题。以下将详细介绍这两个主题,以及如何通过代码示例进行演示。 1. **线程同步**: 线程同步是确保...

    java线程同步java线程同步

    java线程同步java线程同步java线程同步

    JAVA100例之实例65 JAVA线程同步

    本实例65着重讲解了Java线程同步的实现方法,帮助开发者理解和掌握如何在并发环境中保证代码的正确执行。 首先,我们要了解什么是线程。线程是程序中的执行流,每个线程都有自己的程序计数器、栈、局部变量和常量,...

    Java线程同步例子.pdf

    在Java中,线程同步是保证多线程安全...上述Java线程同步例子中涉及到的代码虽然是片段,但涵盖了线程同步处理的多个重要方面,帮助我们理解和使用Java线程同步机制,以及在设计和实现多线程应用程序时的实践和技巧。

    java线程同步基础知识

    Java线程同步是Java编程中一个关键的概念,用于解决多线程环境下的数据一致性问题。在Java中,线程同步主要依赖于监视器(Monitor)机制,它支持两种线程行为:互斥和协作。 互斥是通过对象锁来实现的,确保在任意...

    java线程同步的例子.doc

    Java线程同步是一种控制多个线程访问共享资源的方式,确保数据的一致性和完整性。在这个例子中,我们将讨论如何使用`synchronized`关键字实现线程同步,以及它的工作原理。 首先,我们有两个类`ThreadDemo`和`...

    java 线程同步

    Java线程同步是多线程编程中的一个关键概念,它涉及到如何在并发环境中控制线程对共享资源的访问,以避免数据不一致性和竞态条件等问题。在Java中,线程同步主要有以下几种机制: 1. **synchronized 关键字**: - ...

    Java线程同步与 Java 并发设施.pdf

    Java线程同步是多线程编程中的一个重要概念,其主要目的是确保多个线程在访问共享资源时能够有序进行,避免数据不一致性和竞态条件。在Java中,线程同步可以通过多种方式实现,如synchronized关键字、java.util....

    java线程同步的例子.pdf

    Java线程同步是一种确保多个线程在访问共享资源时能够有序执行的技术,避免了数据的不一致性和竞态条件。在给定的示例中,通过两种方式展示了线程同步:synchronized方法和synchronized代码块。 首先,我们来看同步...

    java线程同步的例子[文].pdf

    本文将详细解释Java线程同步的概念,并通过示例代码来说明其工作原理。 首先,我们需要理解Java中的两个主要同步机制:`synchronized`关键字和`wait()`, `notify()`, `notifyAll()`方法。`synchronized`关键字可以...

    java线程同步(实例讲解,清晰易懂)

    ### Java线程同步详解 #### 一、同步问题的提出 在多线程环境中,当多个线程同时访问和修改同一个共享资源时,可能会导致数据的一致性和完整性问题。例如,考虑下面的一个简单示例: ```java public class Foo { ...

Global site tag (gtag.js) - Google Analytics