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

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

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

能会执行失败的,比如一个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. Easyui Tab使用

    常见问题: 1. easyui 在子tab页中打开新tab页(关于easyUI在子页面增加显示tabs的一个问题) https://blog.csdn.net/u014805893/article/d ...

  2. java接口自动化基础知识(二)

    二.HttpClient+testNG实现对接口的测试及校验 在上面第一篇中已经实现了基础配置和测试用例数据准备,本篇文章将以登录举例进行测试执行. 这是之前login接口的代码 @Test(grou ...

  3. 【原创】大叔问题定位分享(29)datanode启动报错:50020端口被占用

    集群中有一台datanode一直启动报错如下: java.net.BindException: Problem binding to [$server1:50020] java.net.BindExc ...

  4. 网络抓包教程之tcpdump

    现在的移动端应用几乎都会通过网络请求来和服务器交互,通过抓包来诊断和网络相关的bug是程序员的重要技能之一.抓包的手段有很多:针对http和https可以使用Charles设置代理来做,对于更广泛的协 ...

  5. linux 查看java的安装路径

    在linux下,如何找java的安装路径 han@ubuntu:/etc$ whereis java java: /usr/bin/java /usr/share/java /usr/lib/jvm/ ...

  6. c&c++中的宏

    1 c&c++中的宏 do {...} while (0); offsetof & container_of 2 引用 [1] do {...} while (0) 在宏定义中的作用 ...

  7. Hadoop| YARN| 计数器| 压缩| 调优

    1. 计数器应用 2. 数据清洗(ETL) 在运行核心业务MapReduce程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据.清理的过程往往只需要运行Mapper程序,不需要运行Reduc ...

  8. 1、python基础

    本节主要内容 语言特性 变量 注释 字符串拼接 循环 数据类型与字符编码 三元运算 进制 一 .语言特性 python是一门动态解释性的强类型定义语言. 1.编译和解释语言: 简单讲,编译(compl ...

  9. 反素数ant HYSBZ - 1053(数学+dfs)

    对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数1,2,4,6等都是反质 ...

  10. B - Housewife Wind-树链剖分-树状数组

    思路:边权转化到点权上,统一把每一条边的边权集中到深度较深的点上去. #include<stdio.h> #include<iostream> #include<cstr ...