`
thecloud
  • 浏览: 951008 次
文章分类
社区版块
存档分类
最新评论

synchronized用法探究

 
阅读更多

synchronized中文为同步,所谓同步,即是和异步所相对的,同步和异步的概念在多线程和网络通信中有较为广泛的应用。个人觉得同步表示就是多个线程相互之间有规律的进行,而异步则是相互之间没有关系。既然synchronized表示同步,则能够很好的协同各个线程执行。

在java中,当一个代码块被加上synchronized关键字,这部分同步代码就好像是一个见到兵符才听令的军队,而这里的兵符则是一个指定的同步对象。当一个线程运行到同步代码时,可以获得这个被认作是兵符的同步对象,并对这个兵符上了锁,这时当其他线程想调用这个军队时,则需要等之前那个线程释放对兵符的锁,它才可以获得兵符,并再次将这个兵符上锁,调用这个军队。

第一种用法:

synchronized(同步对象) {

  //同步代码

}

这里的同步对象可以是任何一个对象,只有获得这个同步对象的锁才可以运行同步代码,这里如果多个线程同时运行这一部分代码,且同步对象是同一个对象,则需要依次进行,不可以并发进行,这样保证了同步代码的操作完整性。

第二种用法:

public synchronized void method(){

//同步代码

}

这里将一个方法进行同步,实际上,它的效果等同于

public void method(){

synchronized(this) {

   //同步代码

}

}

这里的this指的是这个方法所在的对象。

如果这里的方法是static的话,即:

public synchronized static void method(){

//同步代码

}

转化成

public staticvoid method(){

synchronized(this) {

   //同步代码

}

}

这里的this指的就是这个方法所在的类的.Class对象。

具体到应用比较复杂,举两个例子:
1:


2:


两个例子中,都有一段synchronized的代码。
在1中,main方法中创建的10个线程 不能同时进入到那段代码执行,因为这10个线程需要让
同一个object授权

在2中,main方法中创建的10个线程 可以同时进入到那段代码执行,因为10个线程是让不同
的object授权的,均授权成功,同时进入到那段代码执行

使用同步机制时的注意点:

1.在使用并发时,将域设置为private是非常重要的,否则,synchronized关键字就不能防止其他任务直接访问域,这样会发生冲突。

2.什么时候应该使用同步呢?Brain同步规则:如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且读写线程都必须用相同的监视器锁同步。

3.有时候会用到显示的Lock对象进行处理,因为有了Lock对象,你就可以使用finally子句将系统维护在正确的状态。不会造成死锁的情况。

参考文献

1. 《Thinking in java》

2. java synchronized 用法http://www.cneln.com/club/index/content_fabu.php?book_id=317&id=5446

分享到:
评论

相关推荐

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

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

    深入探究Java多线程并发编程的要点

    1. 直接在`synchronized`代码块或方法中使用`wait()`和`notify()`,这样可以确保只有持有锁的线程才能调用它们,避免了非法唤醒。 2. 在`finally`块中调用`notify()`或`notifyAll()`,以确保即使在异常发生时也能...

    Java学习教程-探究JAVA线程状态及转化视频

    在学习Java线程时,还应掌握同步机制,包括`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`ReentrantLock`、`Semaphore`、`CyclicBarrier`等高级并发工具。理解这些工具的用法和限制,可以...

    long和double类型操作的非原子性探究(csdn)————程序.pdf

    例如,使用AtomicLong替换上面的代码: ```java import java.util.concurrent.atomic.AtomicLong; public class AtomicLongTest { private static AtomicLong test = new AtomicLong(0); public static void ...

    Android中多线程机制的探究.pdf

    AsyncTask提供了`doInBackground()`方法来执行后台任务,`onProgressUpdate()`方法更新进度,以及`onPostExecute()`方法在UI线程中处理任务结果。AsyncTask的执行流程包括:预加载、后台执行、发布进度和最后在主线...

    探究面向空间信息与数字技术专业的Java程序设计教学.zip

    教学应涵盖线程的创建、同步机制(如synchronized关键字和wait/notify机制)以及并发容器的使用。 八、数据库连接和SQL 空间信息通常存储在数据库中,如PostGIS或Spatialite。因此,教学应涉及JDBC连接、SQL查询...

    java多线程

    线程间的同步主要是为了防止数据竞争和死锁问题,通常使用`synchronized`关键字来实现。 ##### 1. 同步块 同步块是通过`synchronized`关键字来控制对象锁的。例如: ```java Object obj = new Object(); ...

    探究iOS多线程究竟不安全在哪里?

    例如,可以使用`@synchronized`关键字围绕对property的访问,以确保同一时刻只有一个线程能执行相关操作。GCD的串行队列也可以实现类似的效果,它会确保队列中的任务按顺序执行,避免了多线程冲突。另外,对于读多写...

    Thread线程知识体系 源码

    通过阅读这些源码,我们可以学习如何创建和启动线程,以及如何实现线程间的通信(例如使用synchronized关键字,wait(),notify(),notifyAll()方法)。 `.idea`目录是IntelliJ IDEA这样的IDE的项目配置信息,通常不...

    SCJP认证最新模拟资料

    学习如何创建和使用线程,同步机制(如synchronized关键字、wait()、notify()、notifyAll()),以及线程池的使用。 五、I/O流 熟悉输入输出流的分类,包括字节流、字符流,以及文件流、对象流和网络流的使用。 六...

    java高级技能全体系知识结构梳理全景图

    1. 多线程与并发:Java提供了丰富的并发工具类和接口,如ExecutorService、Future、Callable、ThreadLocal等,以及synchronized、volatile关键字,理解它们的工作原理和用法,能有效处理多线程环境下的同步和异步...

    疯狂java讲义光盘源代码

    代码中展示了ArrayList、LinkedList、HashSet、HashMap等类的使用方法。 5. **输入/输出流**:Java I/O流用于处理数据的读写。源码中包含了FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等类...

    JAVA思维导图9张!

    6. **多线程**:Java支持并发编程,多线程思维导图会讲解线程的创建、同步机制(如synchronized关键字、wait()、notify()方法)、线程池以及并发集合类。 7. **反射机制**:反射允许程序在运行时动态访问类的信息,...

    java多线程实验报告.doc

    实验结果表明,合理使用synchronized关键字和wait/notify机制可以有效解决多线程环境下的资源竞争和数据一致性问题。 同时,我们也发现了在多线程编程中需要特别注意的问题,比如死锁的风险、资源竞争导致的效率...

    Java面试宝典PDF

    2. 同步机制:掌握synchronized关键字、wait()、notify()、notifyAll()的使用,以及死锁和活锁的预防。 3. 线程池:理解ExecutorService、ThreadPoolExecutor和Executors的使用,以及线程池的参数调整。 五、IO与...

    名师讲坛——Java开发实战经典 带详细书签目录版

    8. **反射机制**:探究Java运行时动态加载类、方法和字段的能力,以及其在元编程中的应用。 9. **泛型**:理解泛型的引入,如何使用泛型类、泛型方法,以及泛型通配符的使用。 10. **Java Swing和AWT**:基础的GUI...

    Thinking In Java 第四版课后习题答案

    8. **多线程**:习题会涵盖Thread类的使用,同步机制(synchronized关键字、wait()、notify()、notifyAll()),以及线程池的使用。 9. **输入输出流**:I/O流在Java中扮演重要角色,习题可能包括文件操作,字符流与...

    2019武汉小米笔试题

    - **操作符**:掌握赋值、算术、比较和逻辑操作符的用法,以及三元运算符的应用。 - **流程控制**:了解if语句、switch语句、for循环、while循环以及do-while循环的使用规则。 2. **类与对象** - **封装**:理解...

    Java并发/多线程

    例如,研究`synchronized`的实现原理,了解锁的升级过程,或者探究`java.util.concurrent`包中并发工具类的内部机制。 12. **Java内存模型(JMM)** - JMM规定了线程之间的内存共享行为,理解JMM有助于避免内存...

Global site tag (gtag.js) - Google Analytics