zoukankan      html  css  js  c++  java
  • syn,wait,notify的理解

    同步是处理多线程时经常用的方法。下面谈一下自己的理解。

    什么时候使用synchronized关键字:

    不论什么时候,只要您将编写的变量接下来可能被另一个线程读取,或者您将读取的变量最后是被另一个线程写入的,那么您必须进行同步。

    先从线程说起。

    新任务的建立可以继承自Runnable或者是Thread,一般来说是继承Runnable,

    因为1,它是一个接口,可以不浪费java中的继承类。2它只有一个run方法需要继承,少了其他的一些杂七杂八的东西。

    参照<java编程思想>里面的说法,我们称实现Runnable接口的类为任务类。

    其实可以这样理解,任务类首先是java中一个类,它和普通类不同的地方就在于它可以不在主线程中执行,能够挂载到另一个线程中来执行。

    需要明确一点任务和同步是两个概念,千万不能混淆。任务中可以包含同步的代码,也可以不包含。也就是run方法中可以有synchronized代码块,也可以没有。

    每一个对象实例都相当于一个房子,多个对象实例相当于多个房子

    理解synchronized代码块要把他理解成为一个带锁的房间。调用该对象方法的线程相当于一个想进入房间的人。

    synchronized上可以安装大锁,小锁,原子锁等等各种不同类型的锁。对应于不同的锁类型,比如实例锁,对象锁,静态锁。

    实例锁:byte[] a = new byte[0];    object a = new object();

    对象锁: this ,或者是synchronized方法块

    静态锁: 类名.class或者是 静态synchronized方法块。

    锁没有大小之分,只有类型不同。

    synchronized分为语句块和方法块,分别对应于上锁的屏风和上锁的门。

    没有synchronized相当于没有锁的门,任何线程,也就是任何人都可以进去。

    synchronized中的wait相当于把钥匙放到客厅,然后等待再次拿到钥匙。

    synchronized中的notify相当于把钥匙放回客厅。

    需要注意的是,当一个线程执行synchronized方法时,别的synchronized方法也都会阻塞。相当于这个钥匙对所有的带锁的房间都适用,一个人拿到钥匙后,另一个人就需要在那里等待。前提是synchronized使用的是同一个锁。

     synchronized锁的是对象的意思是:一旦进入一个synchronized语句块或方法,别的synchronized语句块和方法将阻塞。知道上一个synchronized执行完成或者在其中使用wait方法,主动放弃钥匙。

    实例锁使用byte[] a = new byte[0].比使用object a = new object好。前者三行操作,后者7行操作。

    参考下面的博文:

    http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html

  • 相关阅读:
    Python入门-函数进阶
    Python入门-初始函数
    Leetcode300. Longest Increasing Subsequence最长上升子序列
    Leetcode139. Word Break单词拆分
    Leetcode279. Perfect Squares完全平方数
    Leetcode319. Bulb Switcher灯泡开关
    Leetcode322. Coin Change零钱兑换
    二叉树三种遍历两种方法(递归和迭代)
    Leetcode145. Binary Tree Postorder Traversal二叉树的后序遍历
    Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值
  • 原文地址:https://www.cnblogs.com/lxzh/p/2741336.html
Copyright © 2011-2022 走看看