刚学编程的时候,不懂得同步的概念,只认为程序按照自己写的顺序执行,

直到学到多线程,但当时理解同步问题,也只是面对临界资源需要加锁去控制,

解决一些,如生产消费的问题。但当时一直没考虑过,多线程的情况下,程序可

能会执行失败的,比如一个Integer变量,多线程去累加,所以同步很重要。

涉及例子一共两个:

https://github.com/xuezhankui/Test/blob/master/src/com/xzk/test/TestSynchronized.java

https://github.com/xuezhankui/Test/blob/master/src/com/xzk/test/TestWaitNotifyMain.java

基本原则:

但实例多线程,锁有效。多class实例,同步无效,因为每个实例分别有锁。

1.sychronized

基本用法是 synchronized(obj){   代码块 }

或者方法前加synchronized

1) 代码块很好理解,在一个线程执行完之前,下一个线程会等在代码块外,其实是等待拿obj这个锁。

2) 方法前缀,是以该class的实例作为锁,并不是该方法加锁

经测试:

                   1》.多个方法有synchronized前缀,一个线程调用时,即使另一个线程调用B方法,也许要等待拿到锁才可以。

                   2》.多个方法中,没有synchronized前缀的方法不会被阻塞

     2.Lock

       lock只是接口,实现的类有几个,我例子用的ReentrantLock,没有使用公平锁。

基本用法: private ReentrantLock lock = new ReentrantLock();

使用 上,  锁的时候 lock.lock(); 不过要记得释放, lock.unlock();  简单的方式是try里面lock,finally里面去做unlock。

补充,有个Condition,可以搜一下,可作为条件去,支持wait和notify,只是方法名字不一样。

3. 其他lock

其他锁没怎么看,有个读写锁,基本原则是读锁和写锁分开,写的时候阻塞读,读的时候锁是共享的。有空的时候写写例子再补充

4.wait notify

wait是让当前线程进入等待队列, notify是唤醒一个线程,notifyAll是唤醒所有等待的,然后再竞争锁。如果关注顺序需要用队列。

一般情况下,写法:

synchronized(obj){

        while(true){

if(需要等待资源)

         obj.wait();

执行完成

obj.notifyAll();

}

   }

         特别注意:以上只是写法,并不是逻辑,写的时候要注意防止死锁,上面只是生产消费模式中其中一方大概写法。

synchronized和Lock复习的更多相关文章

  1. 线程安全、数据同步之 synchronized 与 Lock

    本文Demo下载传送门 写在前面 本篇文章讲的东西都是Android开源网络框架NoHttp的核心点,当然线程.多线程.数据安全这是Java中就有的,为了运行快我们用一个Java项目来讲解. 为什么要 ...

  2. 【转载】synchronized 与 Lock 的那点事

    最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...

  3. 转:synchronized和LOCK的实现原理---深入JVM锁机制

    JVM底层又是如何实现synchronized的? 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug ...

  4. synchronized 与 Lock 的那点事

    最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...

  5. JAVA中synchronized和lock详解

         目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...

  6. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  7. synchronized和lock比对

    前言:在上面的博客说了synchronized的一些用法,下面我们再来看看lock,这个出现频率也是非常高的一个. 1:获取Lock锁的几种方式 前面说了synchronized有锁对象和锁类对象,当 ...

  8. Java中synchronized和Lock的区别

    synchronized和Lock的区别synchronize锁对象可以是任意对象,由于监视器方法必须要拥有锁对象那么任意对象都可以调用的方法所以将其抽取到Object类中去定义监视器方法这样锁对象和 ...

  9. 【Java】synchronized与lock的区别

    从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchronized来实现同步访问了 ...

随机推荐

  1. 【easy】112.path sum 113.-----------------

    求是否有从根到叶的路径,节点和等于某个值. /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tree ...

  2. Error: Could not find or load main class Test

    问题描述 Linux 环境下运行 Java 程序时,执行 javac Test.java 生成 Test.class 文件,再执行 java Test 时报错:Error: Could not fin ...

  3. mysql的小常识

    为了爬虫的需要,稍微预习一下mysql: 选择当前的数据库后,查看数据库信息用: USE; 删除:DROP DATABASE spiders #删除name为spiders的的数据库 选择:SELEC ...

  4. IP地址分类(A类 B类 C类 D类 E类)

    IP地址分类(A类 B类 C类 D类 E类) IP地址由四段组成,每个字段是一个字节,8位,最大值是255,, IP地址由两部分组成,即网络地址和主机地址.网络地址表示其属于互联网的哪一个网络,主机地 ...

  5. 【转载】ImportFbx Errors

    [转自http://blog.csdn.net/chenggong2dm/article/details/39580735] 问题: 在导入动作的时候出现一个错误: ImportFBX Errors: ...

  6. TopCoder SRM500 Div1 250 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/SRM500-250.html SRM500 Div1 250 题意 (看题用了半个小时--) 有 n 个人(编号 ...

  7. Spring Data JPA入门

    1. Spring Data JPA是什么 它是Spring基于ORM框架.JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常用功能, ...

  8. (一)主域相同子域不同之document.domain跨域

    一.什么是主域名,什么是子域名? 主域名又称一级域名或者顶级域名,由域名主体.域名后缀组成,比如cnblogs.com : 子域名有二级域名,比如www.cnblogs.com.三级域名,比如home ...

  9. 2019-2-13TextBox技巧

    清空所有的TextBox文本框 思路:这些TextBox都是在一个窗体上的,这时候我们可以利用一个循环去遍历窗体上所有的TextBox控件.(代码如下) foreach (Control i in C ...

  10. SSM框架主要几个注解的位置

    @Controller @Service @Repository @Component Controller (控制层) Service (业务层) daoImpl (实现层) 模糊注解 @Autow ...