前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >笔记 35 | java线程之线程安全与非线程安全

笔记 35 | java线程之线程安全与非线程安全

作者头像
项勇
发布于 2018-06-19 07:22:16
发布于 2018-06-19 07:22:16
62600
代码可运行
举报
文章被收录于专栏:项勇项勇
运行总次数:0
代码可运行

地址

CSDN http://blog.csdn.net/xiangyong_1521/article/details/78541142


线程安全与非线程安全

ArrayList和VectorHashMap和HashTableStringBuilder和StringBuffer这些有什么区别?

这些面试题常被问,答案是,左边的都是非线程安全,右边都是线程安全!

然后又问你,什么是线程安全,什么是非线程安全呢?

A.线程安全

当多个线程类并发操作某类的方法A,来修改这个A方法的某个成员变量的值B,B不会出错,则我们就说,该的这个A方法是线程安全的。   某类的某方法是否线程安全的关键是:   (1) 该方法是否修改该类的成员变量;   (2) 是否给该方法加锁(是否用synchronized关键字修饰)。

B.非线程安全

当多个线程类并发操作某类的方法A,来修改这个A方法的某个成员变量的值B,B会出错,则我们就说,该的这个A方法是非线程安全的。


synchronized

如果要把这个方法变成线程安全的,则用 synchronized关键字来修饰该方法即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class counnt{
        private int count = 0;

        /*
         * 当有多个线程类同时操作这个方法是,就容易出问题
         */
        public void add(){
            count++;
        }

        /*
         * 当加了synchronized修饰后,就是线程安全的了,不过性能很低
         */
        public synchronized void adds(){
            count++;
        }
    }

例子理解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Double dou(){
        int a = 5;
        int b = 2;
        return new Double(a/b);
    }

在执行这个方法时,每一个线程都有自己的独立的栈区。当线程进入到方法执行断的时候,一个方法变量在方法代码段中被创建,并保存在线程的栈区(静态方法也放在这里)。不同线程执行这段代码时,会有不同的a/b变量。所以这里是线程安全的,因为没有数据共享。

考虑下面的例子,多线程情况下只执行一次并可以重用结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Double dou;
    public Double dou(){
        int a = 5;
        int b = 2;
        if (dou == null) {
            dou = new Double(a/b);
        }
        return dou;
    }

这个地方虽然优化了,但可惜他不是线程安全的。两个线程并发执行的时候同时进入到dou ==null这个位置,这样可能会new出一个脏的数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static ThreadLocal local = new ThreadLocal();
    public Double dou(){
        int a = 5;
        int b = 2;
        if (local.get() == null) {
            local.set(new Double(a/b));
        }
        return (Double)local.get();
    }

ThreadLocal类封装了任何类型对象,并把它绑定到当前线程。线程执行dou()方法的时候,实例pi返回的是当前线程的对象。这样的调用是线程安全的。

线程安全跟非线程安全如何取舍

从第一个例子可得知,非线程的方法添加synchronized修饰就可以转化为线程安全,但是性能会相差20倍左右,如果不加的话,该类的成员变量又可能发生错误,所以具体就看你的需求,一个是否有很多线程操作这个方法,一个是否注重它的性能!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 项勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 实现ARP扫描与欺骗
ARP欺骗又称ARP毒化或ARP攻击,是针对以太网地址解析协议ARP的一种攻击技术,通过欺骗局域网内访问者PC的网关MAC地址,使访问者PC错以为攻击者更改后的MAC地址是网关的MAC,导致网络不通。此种攻击可让攻击者获取局域网上的数据包甚至可篡改数据包,且可让网络上特定计算机或所有计算机无法正常连线。
王瑞MVP
2022/12/28
1.3K0
Python 实现ARP扫描与欺骗
calico跨网段不通_多对网桥ip地址相同
Calico 是一个基于BGP协议的网络互联解决方案。它是一个纯3层的方法,使用路由来实现报文寻址和传输。 相比 flannel, ovs等SDN解决方案,Calico 避免了层叠网络带来的性能损耗。将节点当做 router ,位于节点上的 container 被当做 router 的直连设备。利用 Kernel 来实现高效的路由转发。 节点间的路由信息通过 BGP 协议在整个 Calico 网络中传播。 具有以下特点: 1. 在 calico 中的数据包不需要进行封包和解封。 2. 基于三层网络通信,troubleshoot 会更方便。 3. 网络安全策略使用 ACL 定义,基于 iptables 实现,比起 overlay 方案中的复杂机制更只管和容易操作。
全栈程序员站长
2022/11/18
2.3K0
calico跨网段不通_多对网桥ip地址相同
Linux 命令(199)—— arp 命令
arp(Address Resolution Protocol)操作主机的 ARP 缓存。
恋喵大鲤鱼
2022/11/29
5.1K0
Gentoo下的ARP防御
arp是困扰很多人的问题, 利用arp协议的漏洞,别人可以很容易的在你的页面上挂上木马。简单的说,arp攻击就是利用arp自身的漏洞,欺骗你的机器访问虚假的网关,在那个虚假的网关上被植入木马代码的行为。 前两天Pett留言说他访问我的博客发现有病毒,虽然我没能重现他所反应的问题。 但是我想八九不离十应该是机房局域网中的arp攻击所致。
EltonZheng
2021/01/22
5930
ARP-基础-扫描-攻击-防范
ARP(Address Resolution Protocol)地址解析协议,将已知IP地址转换为MAC地址,由RFC820定义 ARP协议在OSI模型中处于数据链路层,在TCP/IP模型中处于网络层 ARP协议与数据链路层关联网络层
糖果
2019/11/20
2.4K0
arp命令_arp协议的主要功能是什么
ARP(Address Resolution Protocol)命令用于显示和修改“地址解析协议(ARP)”缓存中的项目 ARP 把IP 地址解析成 LAN 硬件使用的媒体访问控制地址。以太网设备并不识别32位IP地址,它们是以48位以太网地址传输以太网数据包
全栈程序员站长
2022/11/01
6850
linux之arp和arping命令
一般会使用arp协议获取局域网内的主机MAC,所以局域网主机之间也互称为网络邻居。
陈不成i
2021/05/26
10.6K0
Python ARP缓存投毒与DNS欺骗
利用Scapy进行ARP缓存投毒 from scapy.all import * import os import sys import threading import signal def restore_target(gateway_ip,gateway_mac,target_ip,target_mac): #以下代码中调用send函数的方式稍有不同 print "[*] Restoring target... " send(ARP(op=2,psrc=gateway_ip,
王瑞MVP
2022/12/28
2K0
Linux下检测IP地址冲突及解决方法
问题说明: 在公司办公网内的一台物理机A上安装了linux系统(ip:192.168.9.120),在上面部署了jenkins,redmine,svn程序。由于是在办公网内,这台机器和同事电脑都是在同一网段的。 突然某天问题出来了:有部分同事远程ssh登陆不上这台linux系统的机器,jenkins/redmine/svn也登陆不上,其他部分同事可以正常使用。 后来发现,是因为这台linux机器的ip被人占用了,ip地址冲突引起的!! 下面介绍下检查ip地址是否冲突的方法: ----------------
洗尽了浮华
2018/01/22
5.7K0
Linux下检测IP地址冲突及解决方法
CentOS 7解决arp欺骗
某天发现一台CentOS机器网络一切正常, 但是却无法正常上网. 后经查询, 发现该机器的网关mac地址与实际网关的mac地址不符.  下面是查看和解决办法.
用户8851537
2021/07/22
2K0
外包精通--k8s之flannel网络
vxlan(virtual Extensible LAN)虚拟可扩展局域网,是一种overlay的网络技术,使用MAC in UDP的方法进
Godev
2023/06/25
9590
教你一招在 Windows、Linux和Mac中检查和清除ARP缓存
ARP代表地址解析协议,它负责发现MAC地址并将它们映射到IP地址,以便与本地网络上的其他系统成功通信,该协议工作在数据链路层和网络层之间。
网络技术联盟站
2023/03/13
4.5K0
教你一招在 Windows、Linux和Mac中检查和清除ARP缓存
ARP欺骗与中间人攻击
在上一篇 WIFI密码破解笔记中说到如何探测附近开放的AP并且破解进入,那么进入别人据局域网我们能干些什么呢?换句话说如果别人进入了我们内部网络,会有什么影响?本文简要介绍了ARP和MITM原理,并在实际环境中对目标主机的流量进行劫持。可以看到公共网络中普遍存在许多不安全的问题,藉此来说说局域网中的客户端究竟面临着怎样的隐私泄漏和安全风险。
evilpan
2023/02/12
1.1K0
十二.Linux网络管理
在/etc/sysconfig/network-scripts/目录下有不少文件,绝大部分都是脚本类的文件,但有一类ifcfg开头的文件为网卡配置文件(interface config),所有ifcfg开头的文件在启动网络服务的时候都会被加载读取,但具体的文件名ifcfg-XX的XX可以随意命名。
对弈
2019/09/04
2.8K0
learning: arping
昨天更新了一下最新的vpp master分支代码,发现新加了一个arping的插件,所以就想了解一下arping命令的作用及用法。百度了一下介绍arping的资料还是很多的。下面一起来学习一下吧。
dpdk-vpp源码解读
2023/03/07
1.3K0
learning: arping
高薪Linux必备之高并发场景 LVS 简快入门实战(万字长文)
随着移动互联网的加速,应用大规模同时使用的情况成为了常态,如微博、知乎、今日头条等大型应用,作为Linux运维从业者,高并发场景的解决能力成为了高薪的关键。 今天我们特别邀请了资深的Linux运维老司机惨绿少年Linux来给大家普及高并发场景 LVS的实现过程,助你高薪之路顺畅。 作者:惨绿少年Linux,马哥Linux原创作者社群特约作者,资深Linux运维工程师,作者博客:www.nmtui.com,擅长虚拟化、OpenStack等前沿技术。 1.1 负载均衡介绍 ---- 1.1.1 负载均衡的
小小科
2018/05/04
1.3K0
高薪Linux必备之高并发场景 LVS 简快入门实战(万字长文)
ARP欺骗常见姿势及多机ARP欺骗
ARP欺骗是一个老生常谈的话题,翻看各位师傅的文章,大多数都是在使用arpspoof(当然,同样看到过使用Python写一款类似的工具的文章)进行单机欺骗。本文的目的在于总结ARP欺骗原理、常见姿势以及实现多机ARP欺骗。
FB客服
2019/08/30
3K0
ARP欺骗常见姿势及多机ARP欺骗
linux命令总结之ip命令
Linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中已被废弃使用的一个命令,许多年前就已经没有维护了。iproute2套件里提供了许多增强功能的命令,ip命令即是其中之一。
西湖醋鱼
2020/12/30
3.3K0
linux命令总结之ip命令
linux网络配置和故障排除命令总结
1.ifconfig ifconfig命令 被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。 # ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.24.186.123 netmask 255.255.240.0 broadcast 172
入门笔记
2022/06/02
1.5K0
linux基础命令介绍六:网络
本文将讲述网络相关命令,作者假定读者具备TCP/IP协议栈的基础知识。对于相关命令及其输出只介绍它的基本的使用方法和大概的描述,具体协议将不作详细解释。
用户5030870
2019/04/11
1.9K0
相关推荐
Python 实现ARP扫描与欺骗
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文