线程安全

what is the mean of thread safe ?线程安全是什么意思呢?

喜夏-厌秋 提交于 2020-04-15 05:47:59
【推荐阅读】微服务还能火多久?>>> 一、线程安全是什么意思 As Seth stated thread safe means that a method or class instance can be used by multiple threads at the same time without any problems occuring. Consider the following method: private int myInt = 0;public int AddOne(){ int tmp = myInt; tmp = tmp + 1; myInt = tmp; return tmp;} Now thread A and thread B both would like to execute AddOne(). but A starts first and reads the value of myInt (0) into tmp. Now for some reason the scheduler decides to halt thread A and defer execution to thread B. Thread B now also reads the value of myInt (still 0) into it's own variable

设计模式-单例模式JAVA实现

半世苍凉 提交于 2020-04-08 08:40:13
单例模式其实是一种面向底层的开发模式,业务里能用到的环境不是很多。这里权且以项目启动时获取仓库信息做示例。 一,饿汉模式,在项目一启动的时候就将所需要的对象实例化出来。虽然传说中可能会占用内存不一定会用到,但实际上写一个不会被用到的例的可能性极小,不过不排除一些业务类可能会因为业务的变更迁移而被废掉,这么看来还是有些道理的。 饿汉式的单例模式是线程安全的,因为在发起多线程之前这个对象就已经存在了 package Singleton; /** 单例模式,饿汉式 @author zhousjmas@hotmail.com */ public class WmsSingleton { //只在这里创建一次,是线程安全的 private static WmsSingleton singleton = new WmsSingleton(); private WmsSingleton() {} public static WmsSingleton getInstance() { System.out.println("获取对象前对象信息:"+singleton); return singleton; } } 一般的懒汉式不一定线程安全,所谓的线程安全,简略来讲只要你要对类的静态常量有修改的动作,那就可能会涉及到非线程安全 package Singleton; /** 单例模式,懒汉式

设计模式-单例模式JAVA实现

六月ゝ 毕业季﹏ 提交于 2020-04-08 08:38:26
单例模式其实是一种面向底层的开发模式,业务里能用到的环境不是很多。这里权且以项目启动时获取仓库信息做示例。 一,饿汉模式,在项目一启动的时候就将所需要的对象实例化出来。虽然传说中可能会占用内存不一定会用到,但实际上写一个不会被用到的例的可能性极小,不过不排除一些业务类可能会因为业务的变更迁移而被废掉,这么看来还是有些道理的。 饿汉式的单例模式是线程安全的,因为在发起多线程之前这个对象就已经存在了 package Singleton; /** 单例模式,饿汉式 @author zhousjmas@hotmail.com */ public class WmsSingleton { //只在这里创建一次,是线程安全的 private static WmsSingleton singleton = new WmsSingleton(); private WmsSingleton() {} public static WmsSingleton getInstance() { System.out.println("获取对象前对象信息:"+singleton); return singleton; } } 一般的懒汉式不一定线程安全,所谓的线程安全,简略来讲只要你要对类的静态常量有修改的动作,那就可能会涉及到非线程安全 package Singleton; /** 单例模式,懒汉式

设计模式-单例模式JAVA实现

杀马特。学长 韩版系。学妹 提交于 2020-04-08 08:38:04
单例模式其实是一种面向底层的开发模式,业务里能用到的环境不是很多。这里权且以项目启动时获取仓库信息做示例。 一,饿汉模式,在项目一启动的时候就将所需要的对象实例化出来。虽然传说中可能会占用内存不一定会用到,但实际上写一个不会被用到的例的可能性极小,不过不排除一些业务类可能会因为业务的变更迁移而被废掉,这么看来还是有些道理的。 饿汉式的单例模式是线程安全的,因为在发起多线程之前这个对象就已经存在了 package Singleton; /** 单例模式,饿汉式 @author zhousjmas@hotmail.com */ public class WmsSingleton { //只在这里创建一次,是线程安全的 private static WmsSingleton singleton = new WmsSingleton(); private WmsSingleton() {} public static WmsSingleton getInstance() { System.out.println("获取对象前对象信息:"+singleton); return singleton; } } 一般的懒汉式不一定线程安全,所谓的线程安全,简略来讲只要你要对类的静态常量有修改的动作,那就可能会涉及到非线程安全 package Singleton; /** 单例模式,懒汉式

在python中使用memcached --- Python-memcached

你。 提交于 2020-04-08 07:19:51
1.memcached安装 使用apt-get安装memcached # sudo apt-get install memcached 启动一个memcached实例 # memcached -m 10 -p 12000 -m 10 是指定最多使用的内存大小单位是M,如果不指定默认会使用64M -p 12000 是指定端口号,默认端口为11211 另一个例子 说明一下参数 memcached -d -m 10 -u root -l 192.168.40.4 -p 12000 -c 256 -P /tmp/memcached.pid 参数说明: -d选项是启动一个守护进程 -m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB -u是运行Memcache的用户,我这里是root -l是监听的服务器IP地址 -p是设置Memcache监听的端口,最好是1024以上的端口 -c选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定 -P是设置保存Memcache的pid文件 memcached配置文件存放在 /etc/memcached.conf 日志文件存放在 /var/log/memcached.log Memcached 操作: telnet localhost 11334 set foo 0 0 3 bar STORED get foo

清明花了几天总结了多线程的知识点

家住魔仙堡 提交于 2020-04-07 09:53:11
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star : https://github.com/ZhongFuCheng3y/3y 在上周总结了一篇「工作中常用到的Java集合类」,反响还不错。这周来写写Java另一个重要的知识点:「 多线程 」 多线程大家在初学的时候,对这个知识点应该有不少的疑惑的。我认为主要原因有两个: 多线程在初学的时候不太好学,并且一般写项目的时候也很少用得上(至少在初学阶段时写的项目基本不需要自己创建线程)。 多线程的知识点在面试经常考,多线程所涉及的知识点非常多,难度也不低。 这就会给人带来一种感觉「 这破玩意涉及的东西是真的广,平时也不怎么用,怎么面试就偏偏爱问这个鬼东西 」 不多BB,我要开始了。 为什么使用多线程? 首先,我们要明确的是「为什么要使用多线程」,可能有人会认为「 使用多线程就是为了加快程序运行的速度啊 」。如果你是这样回答了,那面试官可能会问你「那多线程是怎么加快程序运行速度的?」 于我的理解:使用多线程最主要的原因是 提高系统的资源利用率 。 现在CPU基本都是多核的,如果你只用单线程,那就是只用到了一个核心,其他的核心就相当于空闲在那里了。 厕所的坑位有5个,如果只用一个坑位,那不是很亏?比如现在我有5个人要上厕所。 在单线程的时候:进去一个人解决要10分钟,然后后面的人都得等一个坑位

【ArrayList】为什么java.util.concurrent 包里没有并发的ArrayList实现?

混江龙づ霸主 提交于 2020-04-07 04:12:52
为什么java.util.concurrent 包里没有并发的ArrayList实现? 问:JDK 5在java.util.concurrent里引入了ConcurrentHashMap,在需要支持高并发的场景,我们可以使用它代替HashMap。但是为什么没有ArrayList的并发实现呢?难道在多线程场景下我们只有Vector这一种线程安全的数组实现可以选择么?为什么在java.util.concurrent 没有一个类可以代替Vector呢? 答:我认为在java.util.concurrent包中没有加入并发的ArrayList实现的主要原因是: 很难去开发一个通用并且没有并发瓶颈的线程安全的List。 像ConcurrentHashMap这样的类的真正价值(The real point / value of classes)并不是它们保证了线程安全。而在于它们在保证线程安全的同时不存在并发瓶颈。举个例子,ConcurrentHashMap采用了锁分段技术和弱一致性的Map迭代器去规避并发瓶颈。 所以问题在于,像“Array List”这样的数据结构,你不知道如何去规避并发的瓶颈。拿contains() 这样一个操作来说,当你进行搜索的时候如何避免锁住整个list? 另一方面,Queue 和Deque (基于Linked List

技术大牛详谈如何正确使用 Volatile 变量

旧时模样 提交于 2020-04-05 23:05:26
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。 本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。 可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。 Volatile 变量 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。 Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器

java 线程安全

本秂侑毒 提交于 2020-04-04 09:21:12
1. synchronized 2.Lock package com.jack.test2; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MyRunnable3 implements Runnable { int len = 5; int tikets = len; Object obj = new Object(); Lock l = new ReentrantLock(); @Override public void run() { while (true) { l.lock(); try { if (tikets > 0) { System.out.println(Thread.currentThread().getName() + "卖票中:第" + (len + 1 - tikets) + "张票"); tikets--; } } finally { l.unlock(); } } } } package com.jack.test2; import static java.lang.Thread.sleep; public class MyRunnable implements Runnable { int

Java面试题集锦

依然范特西╮ 提交于 2020-04-03 05:27:09
1. String、StringBuffer和StringBuilder的区别。 (1) String:存储数值不可改变的字符串 (2) StringBuffer:可变字符序列、线程安全、效率低 (3) StringBuilder:可变字符序列、线程不安全、效率高 2. final, finally, finalize的区别。 (1) final修饰的类不能被继承,修饰的方法不能被子类重写,修饰的属性为常量。一旦初始化后,不可再被赋值。习惯上,常量 用大写字符表示。 (2) finally是异常处理语句结构的一部分,表示总是执行。 (3) finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其 他资源回收,例如关闭文件等。 3. HashMap和Hashtable的区别。(都完成了Map接口) (1) HashMap是Hashtable的轻量级实现(非线程安全的实现),效率较高,而Hashtable是线程安全的,效率较低。 (2) Hashtable不允许使用 null 作为 key 和 value,而HashMap 可以。 (3) Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。