Java中并发的形式无非是多线程和多进程两种形式。这两种形式都是可以利用多核来发挥计算能力的。

先说并发:

多进程意味着同时运行多个JVM,这个代价通常比多线程高,每个JVM都有自己的堆栈、都要分别加载各自的类。但是多进程的好处是“隔离性”更好,一个JVM中的程序在运行时发生故障不会对其他JVM产生很大的影响。而在多线程的情况下,一些致命错误可能导致整个JVM挂掉,祸及全体。多线程可以方便地共享内存中的内容,这很方便但有时候也会造成混乱,要小心才是。

在说同步:

在Java的线程之间实现同步是很简单的,用synchronized预就可以实现,再不济就用java.util.concurrent.locks下提供的锁。要注意的是加锁的域或者对象是否正确,以及wait()等操作是会释放synchronized锁的。

而进程间的同步就困难一些了,因为进程之间没有了synchronized这样的机制来保证一个程序段或者一个对象被串行执行和访问。一个进程在执行时,没法预支在执行当前指令和执行下一条指令之间的一刹那会发生什么。比如你创建了一个文件:

  1. File file = new File("123");
  2. if (file.exists())
  3. // do something on the file

看似你是检查文件已存在,然后做了一些读写之类的操作,万无一失的样子。但实际上,在执行完exists()方法返回true之后的那一刹那,这个文件可能就被删除或者重命名了。

对于进程之外的很多资源,都存在这样的情况。这就需要通过文件锁之类的机制来保证正确的资源共享。可以通过操作系统API实现,也可以利用jdk提供的一些API,例如:

http://www.concretepage.com/java/example-filelock-java-nio-channels

https://docs.Oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html

java---同步与并发概念的更多相关文章

  1. java多线程中并发集合和同步集合有哪些?区别是什么?

    java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...

  2. 探索 Java 同步机制[Monitor Object 并发模式在 Java 同步机制中的实现]

    探索 Java 同步机制[Monitor Object 并发模式在 Java 同步机制中的实现] https://www.ibm.com/developerworks/cn/java/j-lo-syn ...

  3. 12、Java并发性和多线程-Java同步块

    以下内容转自http://ifeve.com/synchronized-blocks/: Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免 ...

  4. Java 多线程 (并发)总结

    一.概念 1. 维基百科解释 进程是什么? http://zh.wikipedia.org/wiki/%E8%BF%9B%E7%A8%8B 线程是什么? http://zh.wikipedia.org ...

  5. Java多线程与并发模型之锁

    这是一篇总结Java多线程开发的长文.文章是从Java创建之初就存在的synchronized关键字引入,对Java多线程和并发模型进行了探讨.希望通过此篇内容的解读能帮助Java开发者更好的理清Ja ...

  6. Java编程思想 - 并发

    前言 Q: 为什么学习并发? A: 到目前为止,你学到的都是有关顺序编程的知识,即程序中的所有事物在任意时刻都只能执行一个步骤. A: 编程问题中相当大的一部分都可以通过使用顺序编程来解决,然而,对于 ...

  7. java锁与监视器概念 为什么wait、notify、notifyAll定义在Object中 多线程中篇(九)

    在Java中,与线程通信相关的几个方法,是定义在Object中的,大家都知道Object是Java中所有类的超类 在Java中,所有的类都是Object,借助于一个统一的形式Object,显然在有些处 ...

  8. 高并发第二弹:并发概念及内存模型(JMM)

    高并发第二弹:并发概念及内存模型(JMM) 感谢 : 深入Java内存模型 http://www.importnew.com/10589.html, cpu缓存一致性 https://www.cnbl ...

  9. Java 多线程高并发编程 笔记(一)

    本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...

  10. 031.[转] 从类状态看Java多线程安全并发

    从类状态看Java多线程安全并发 pphh发布于2018年9月16日 对于Java开发人员来说,i++的并发不安全是人所共知,但是它真的有那么不安全么? 在开发Java代码时,如何能够避免多线程并发出 ...

随机推荐

  1. cocos2d-x eclipse + NDK 自动编译配置

    文章来自:http://www.cocos2dres.com/view.asp?id=90 1. 准备工作: android NDK    r8版本 ADT Bundle 下载地址:http://de ...

  2. Creating a Unity Game for Windows 8

    原地址:http://www.davebost.com/2013/08/30/creating-a-unity-game-for-windows-8 The recent release of Uni ...

  3. javaSE知识点汇总

    Java基础知识精华部分   写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言 ...

  4. MVC里使用JSON方法集锦

    //一般处理,无参数示例 public JsonResult Test() { Something... return Json{new{Success=true,Msg="Error!&q ...

  5. ThreadPoolExecutor中策略的选择与工作队列的选择(java线程池)

    工作原理 1.线程池刚创建时,里面没有一个线程.任务队列是作为参数传进来的.不过,就算队列里面有任务,线程池也不会马上执行它们. 2.当调用 execute() 方法添加一个任务时,线程池会做如下判断 ...

  6. centos 6.5安装docker报错(查看报错详细信息--推荐)

    (1)yum安装docker [root@namenode ~]# yum install docker-io (2)启动docker [root@namenode ~]# /etc/init.d/d ...

  7. Mysql导入大SQL文件数据问题

    如果sql文件过大,会出现mysql out of memory  (Needed XXX bytes) ,或者 "MySQL server has gone away"问题; 另 ...

  8. dubbox rest协议jackson 反序列化的坑

    dubbox 相对于dubbo 对了 rest 协议的支持  而且默认序列化的协议 是json dubbox 内部是通过 RestEasy 处理 rpc 服务 而 RestEasy获取序列化是 是通过 ...

  9. python模块介绍-locustio:性能测试工具locustio

    转自:http://automationtesting.sinaapp.com/blog/m_locustio_doc python测试文章 http://weibo.com/cizhenshi?is ...

  10. 【转载】Linux 系统时间查看 及 时区修改(自动同步时间)

    1:使用date命令查看时区 [root@db-server ~]# date -R   Sun, 11 Jan 2015 07:10:28 -0800   [root@db-server ~]#   ...