zoukankan      html  css  js  c++  java
  • java并发之synchronized

    众所周知,synchronized功能:同步,保证内存可见性。

    实现原理是靠每个对象都有的monitor锁。

    可修饰方法和代码块,可作用于类或者对象。

    当修饰代码块时,synchronized(object) 作用于对象,只约束该对象。

     synchronized(class)作用于类,约束类所有的对象。

    修饰方法时,synchronized 修饰static方法时,作用于类。修饰非static方法时作用于对象。

    注意类锁和对象锁是两个不同的锁,二者不会发生同步关系。

    由于static变量,可被static方法调用,也可被非static方法调用,当二者同时被synchronized修饰时,所以就会出现潜在的同步问题。

    所以多线程时静态变量尽量只用静态方法调用,不然就会出现同步混乱。

    class Test implements Runnable{
        public  static  int num = 0;
    
        public synchronized void changeNum(){
            num++;
            System.out.println(num);
    
        }
      
        public synchronized static void addNum(){
            num++;
            System.out.println(num);
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 2000; i++) {
                changeNum();
                addNum();
                try {
                    Thread.sleep(5);
                }catch (InterruptedException ie){
    
                }
            }
        }
        public static void main(String[] args) {
     
            Test test = new Test();
            Thread t1 = new Thread(test);
            Thread t2 = new Thread(test);
            t1.start();
            t2.start();
        }
    }
    

    如果同步,结果应该是8000,然而并不是。

  • 相关阅读:
    LeetCode OJ combine 3
    LeetCode OJ 229. Majority Element II
    Install Qualcomm Development Environment
    更改 terminal 開啟時,預設的路徑
    Establishing Android Build Environment
    Definition vs declaration
    declaration specifier, declarator, type specifier
    echo
    sed
    電路板上的 0Ω 電阻作用
  • 原文地址:https://www.cnblogs.com/zqiguoshang/p/6891266.html
Copyright © 2011-2022 走看看