• Synchnorized 辨析 (1)


    示例代码:


    public class SyncTest {

     

          private ListString list= new ArrayListString();

     

          public void syncAddPrint(){

                 synchronized(list){

                        for(int i = 0; i 10; i++) {

                                                                         list.add(""+ i);

                              System.out.println(list);

                        }

                 }

         } 

          public void syncAdd2(){

                 synchronized(list){

                        list.add("A");

                        list.add("B");

                        list.add("C");

                 }

          }

     

          public void  noSyncAdd() {

                 list.add("X");

                 list.add("Y");

                 list.add("Z");

          }

     

          public void noSyncNew(){

                 list= new ArrayListString();

                 list.add("Ha");

                 list.add("Ha");

                 list.add("Ha");

          }

     

          

          public static void main(String[] args){

                 final SyncTest test =new SyncTest();

     

                 Thread thread1 = new Thread() {

                        public void run() {

                              test.syncAddPrint();

                        }

                 };

                 thread1.start();

     

                 Thread thread2 = new Thread() {

                        public voidrun() {

                              test.syncAdd2();

                        }

                 };

                 thread2.start();

     

                 Thread thread3 = new Thread() {

                        public voidrun() {

                              test.noSyncAdd();

                        }

                 };

                 thread3.start();

     

                 Thread thread4 = new Thread() {

                        public voidrun() {

                              test.noSyncNew();

                        }

                 };

                 thread4.start();

          }

     

    }

     

    输出结果可能是:

    [0]

    [0,1]

    [0, 1,2]

    [0, 1, 2,X, 3]

    [0, 1, 2,X, 3, Y, 4]

    [Ha, 5]

    [Ha, 5,Z, 6]

    [Ha, 5,Z, 6, Ha, Ha, 7]

    [Ha, 5,Z, 6, Ha, Ha, 7, 8]

    [Ha, 5,Z, 6, Ha, Ha, 7, 8, 9]


    thread1执行方法syncAddPrint的过程中,thread1获得了锁list


    thread1获得锁list未释放线程thread2执行syncAdd2,但是得不到锁list故而被阻塞。


    thread3执行noSyncAdd,不需要获得锁list所以在方法中轻易将锁list的元素改变


    thread4执行noSyncNew,不需要获得锁list所以在方法中轻易将锁list替换成另一个对象。


    thread3thread4这些对list的改变动作都是在thread1还持有锁list的情况下发生的。

     

    由此可见,要保证锁list在被某线程持有的情况下不被改变,则必须访问锁list的所有代码块都必须使用synchronized(list)才可以,一旦某个方法遗漏,则不可保证。

  • 相关阅读:
    Python实现杨辉三角
    第8.30节 重写Python __setattr__方法实现属性修改捕获
    转:Cookie详解
    第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定
    第8.28节 Python中使用__setattr__定义实例变量和实例方法
    第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
    第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获
    关于open函数文件打开模式的有意思的一个现象
    第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用
    转:关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276472.html
Copyright © 2020-2023  润新知