zoukankan      html  css  js  c++  java
  • JAVA中线程同步的方法(4种)汇总

     

    package com.xhj.thread;
     
        /**
         * 线程同步的运用
         * 
         * @author XIEHEJUN
         * 
         */
        public class SynchronizedThread {
     
            class Bank {
                private int account = 100;
                public int getAccount() {
                    return account;
                }
     
                /**
                 * 1.用同步方法实现
                 * 
                 * @param money
                 */
                public synchronized void save(int money) {
                    account += money;
                }
     
                /**
                 * 2.用同步代码块实现
                 * 
                 * @param money
                 */
                public void save1(int money) {
                    synchronized (this) {
                        account += money;
                    }
                }
            }

    3.wait与notify

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

    4.使用特殊域变量(volatile)实现线程同步

        a.volatile关键字为域变量的访问提供了一种免锁机制
        b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
        c.因此每次使用该域就要重新计算,而不是使用寄存器中的值 
        d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量 
        
        例如: 
            在上面的例子当中,只需在account前面加上volatile修饰,即可实现线程同步。 
    //只给出要修改的代码,其余代码与上同
            class Bank {
                //需要同步的变量加上volatile
                private volatile int account = 100;
     
                public int getAccount() {
                    return account;
                }
                //这里不再需要synchronized 
                public void save(int money) {
                    account += money;
                }
            }
  • 相关阅读:
    Android实现简单的检测手机自由落体关闭屏幕
    Android Disable Package/Component 跳过app安装
    求单向链表中倒数第k个节点(c++):快慢指针/递归
    算法学习笔记---链表与数组
    pycharm使用matplotlib绘图学习笔记
    pycharm使用matplotlib绘制图像报错
    python numpy学习笔记
    python刷leetcode算法-- 左旋转字符串
    机器学习算法扫盲篇
    Kaggle入门篇
  • 原文地址:https://www.cnblogs.com/yuyangcoder/p/9929418.html
Copyright © 2011-2022 走看看