解决Aaraylist线程不安全,以及八种锁的现象

/** *题目:请举例说明集合类是不安全的 * 1,故障现象: * java.util.ConcurrentModificationException * 2,导致原因 * * 3,解决方案 * 3.1 vector * 3.2 Collection.synchronizedList(); * 3.3  new CopyOnWriteArraylist(); * * 4,优化建议(同样的错误,不出现第二次) */public class NotSafeDemo {    public static void main(String[] args) {        List<String>  list= Collections.synchronizedList(new ArrayList<>()); //new  ArrayList<String >();        for(int i=1;i<=30;i++) {            new Thread(() -> {                list.add(UUID.randomUUID().toString().substring(0,8));               System.out.println(list);//一边写一边读            }, String.valueOf(i)).start();        }    }//笔记:    /*    * 写时复制:    * copyOnWrite容器即写时复制的容器,往一个容器添加元素的时候,不直接往当前容器object[]    * 添加,而是先将当前容器object[]进行copy,    * 复制出一个新的容器object[] newElements,然后新的容器object[] newElements里面添加元素,添加完元素之后,    * 再将原容器的引用指向新的容器,setArray(newArrays);这样做的好处是可以copyonWrite容器进行并发的读,    * 而不需要加锁,因为当前容器不会添加任何元素。所以copyOnwrite容器也是一种读写分离的思想,读和写不同的容器    *    * */}---------------------------------------------------------------------------------------------------------------------------------
public class Lock8 {    public static void main(String[] args) {        Phone phone=new Phone();        new Thread(()->{            try {                phone.sendEmail();            }catch (Exception e){            }        },"A").start();     /*   try {            Thread.sleep(2000);        } catch (InterruptedException e) {            e.printStackTrace();        }*/        new Thread(()->{            try {                phone.sendHello();            }catch (Exception e){            }        },"B").start();    }}class Phone{    public synchronized void sendEmail() throws Exception{        try {            TimeUnit.SECONDS.sleep(4);        } catch (Exception e) {            e.printStackTrace();        }        System.out.println("-----sendEmail");    }    public  synchronized void sendSMS() throws Exception{        System.out.println("-----sendSMS");    }    public   void sendHello()throws Exception{        System.out.println("-----sendHello");    }}/** 题目:多线程8锁* 1,标准访问,请问先打印邮件还是短信?邮件,短信* 2,邮件方法暂停4秒钟,请问先打印邮件还是短信?邮件,短信* 解释:一个对象里面如果有多个synchronized方法,某一时刻线程去调用其中一个的esynchronized方法了,* 其它的线程都只能等待,换句话说,某一时刻内,只能有唯一一个线程去访问这些synchronized方法* 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前的其它的synchronized方法* 3,新增一个普通方法hello(),请问先打印邮件还是hello?* 4,两部手机,请问先打印邮件还是短信?* 5,两个静态同步方法,同一部手机,请问先打印邮件还是短信?* 6,两个静态方法,两个手机,请问先打印邮件还是短信?* 7,1个普通同步方法,1个静态同步方法,1部手机,请问先打印邮件还是短信?* 8,一个普通同步方法,1个静态同步方法,2部手机,请问先打印邮件还是短信?* 加一普通方法后发现和同步锁无关* 换成两个对象后,不是同一把锁了,情况立刻变化。* 都换成静态同步方法后,情况又变化* 所有的非静态同步方法用的都是同一把锁即实例对象本身* synchronized实现同步的基础:Java中的每一个对象都可以作为锁。* 具体表现为以下3种形式。* 对于普通同步方法,锁是当前实例对象。***/

原文地址:https://www.cnblogs.com/shanbaoxin/p/11660559.html

时间: 2024-07-31 06:09:46

解决Aaraylist线程不安全,以及八种锁的现象的相关文章

WordPress慢的八种解决方法(用排查法解决)

WordPress的打开速度慢会影响到用户体验和关键词的稳定排名,WordPress为什么加载慢呢?其实很简单的,就是WordPress水土不服,用WordPress的大家都知道,WordPress是外国人开发的,在国内用肯定会卡的,今天笔者给大家整理了几个解决各种WordPress慢的慢的问题,希望能够帮助到大家! 方法一:删除不必要的插件 什么叫不必要的插件呢?就是能用代码解决的就用代码不用插件,不是非常需要的功能类的插件,美化网站的各种插件,常见的久这两种. 方法二:关闭主题的谷歌字体 这

单例模式的八种写法比较

单例模式是最常用到的设计模式之一,熟悉设计模式的朋友对单例模式都不会陌生.一般介绍单例模式的书籍都会提到 饿汉式 和 懒汉式 这两种实现方式.但是除了这两种方式,本文还会介绍其他几种实现单例的方式,让我们来一起看看吧. 简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在. 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为.比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象

java单例设计模式八种方式

单例设计模式介绍 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的SessionFactory,它充当数据存储源的代理,并负责创建Session对象.SessionFactory并不是轻量级的,一般情况下,一个项目通常只需要一个SessionFactory就够,这是就会使用到单例模式. 单例设计模式八种方式 单例模式有八种方式: 饿汉式( ( 静态常 量) ) 饿汉式(静态

敏捷教练的八种失败角色

踏入敏捷圈很久了,参加了很多活动,和众多一线的敏捷教练进行交流,对敏捷教练的八种失败角色有了一些新的感悟,这里再次把这八种失败角色拉出来晒一晒,各位教练请对号入座: 1.   侦探型: 适当观察团队,带着观察的信息,消失在黑暗之中,团队断断续续能感觉到教练的存在,但是似乎看得见摸不着.教练偶尔发出一些观察的信息和建议,但是当团队想找教练沟通时,侦探教练总是神神秘秘. 2.   海鸥型:猛然扎进站立会中,用善意的观察和建议冲击整个团队,然后便飞走了,留下团队在身后,满脸迷茫,不知所措.海鸥教练得到

使用八种牛云存储解决方案ios7.1的app部署问题

使用八种牛云存储解决方案ios7.1的app部署问题 一个.问题叙述性说明 开发完ios版本号的app.须要将.ipa文件和.plist文件打包上传,供用户下载,在线安装.用户安装过程简单描写叙述例如以下: 首先通过手机浏览器safari或者扫描二维码获取到下载.plist的地址. 然后浏览器会自己主动跳转到这个地址,下载.读取.plist.(用户跳转的地址是.plist的下载地址.)这个过程,显然使用http协议来下载.plist文件.最后,iphone通过读取.plist文件里配置的.ipa

Android中UI线程与后台线程交互设计的5种方法

我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启一个后台线程运行这些任务.然而,往往这些任务最终又会直接或者 间接的需要访问和控制UI控件.例如访问网络获取数据,然后需要将这些数据处理显示出来.就出现了上面所说的情况.原本这是在正常不过的现象了,但是 android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控.为了解决

常见的八种导致 APP 内存泄漏的问题(下)

百度搜索:小强测试品牌 QQ群:138269539 Handlers 同 样的,定义一个匿名的 Runnable 对象并将其提交到 Handler 上也可能导致 activity 泄漏.Runnable 对象间接地引用了定义它的activity 对象,而它会被提交到 Handler 的 MessageQueue 中,如果它在 activity 销毁时还没有被处理,那就会导致 activity 泄漏了. Threads 同样的,使用 Thread 和 TimerTask 也可能导致 activit

java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:

总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但是实现Runnable接口可以处理同一个资源. 下面我们做个测试:验证下.车站的售票系统售票的例子,车站的各个售票口相当于各个线程,我们先使用第一种方法几继承Thread类的方式实现: 代码如下: package com.lp.ecjtu.Thread; /** * * @author Admini

Java语言中八种基本类型对应的?包装类类型

八种基本类型对应的包装类类型 byte                     Byte int                        Integer char                     Character short                    Short long                     Long boolean               Boolean float                     Float double