Synchronized全面详解

news/2024/5/17 15:21:49 标签: Synchronized,

线程安全的概念:
    当多个线程访问同一个类(对象或方法)的时候,该类始终能表现出正确的行为,
    那么这个类(对象或者方法)就是线程安全的。
Synchronized:
一、多个线程一个
    1、按照cpu分配的先后顺序排队访问
    2、不断尝试获得
    3、如果拿到执行代码块里的内容,如果拿不到继续尝试获得
    4、存在竞争的问题

二、多个线程多个
    关键字 synchronized获得的都是对象,而不是把一段代码或方法当成
    static synchronized methodname(){}:
    该方法是住一个.class类,独占,多线程环境下,不同的对象访问,要竞争该,排队执行;

    synchronized methodname(){}:
    住的是持有该方法所属的对象的(Lock),不同线程上不同的对象访问该方法互不影响,
    多个(eg:2)对象,线程获得的就是多个(2)不同的;
    是该方法所在类 new 的一个对象上的一个,同一个对象访问该方法多次按照先后顺序排队;
    
asynchronized:
    异步:不加synchronized,修饰方法的时候,不需要释放该对象上的,该对象就可以直接调用该方法;

    
同步的目的就是为了线程安全,其实线程安全来说,需要满足2个特性:
1、原子性
2、可见性
    
脏读;
    对同一个对象方法加的时候,要考虑到业务整体性,get和set要同时加synchronized,保证业务的原子性
    不然出现脏数据;
    
synchronized 拥有重入功能:
    当一个线程得到一个对象之后,再次请求此对象时候是可以再次得到该对象的,出现异常自动释放;

注意:
1、尽量不要用代码块去代替方法,减少的粒度;
2、不要使用String的常量加,会出现死循环;当使用一个对象加,如果该对象本身发生改变,那么持有的
    就不同,如果对象本身不发生改变,那么依然是同步,几十是对象的熟悉发生改变;
3、死问题:
    死是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。
    由于线程被无限期地阻塞,因此程序不可能正常终止。
    java 死产生的四个必要条件:
    1、互斥使用,即当资源被一个线程使用(占有)时,别的线程不能使用
    2、不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。
    3、请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占有。 
    4、循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。
    这样就形成了一个等待环路
    
当上述四个条件都成立的时候,便形成死。当然,死的情况下如果打破上述任何一个条件,便可让死消失。

解决死问题的方法是:一种是用synchronized,一种是用Lock显式实现。

 

时间不早了,睡觉。。。。

    

    
    

    

    
    


http://www.niftyadmin.cn/n/1621330.html

相关文章

处理Python2.7读写文件中的中文乱码问题

1.设置默认编码 在Python代码中的任何地方出现中文,编译时都会报错,这时可以在代码的首行添加相应说明,明确utf-8编码格式,可以解决一般情况下的中文报错。当然,编程中遇到具体问题还需具体分析啦。 #encoding:utf-8 或者 # -*- c…

为域名快速生成证书

这里写目录标题为域名快速生成证书1. 下面这个脚本不能,有 bug2. 用法3. 脚本 gencert.sh为域名快速生成证书 1. 下面这个脚本不能,有 bug 会出现这种问题: x509 cannot validate certificate for 127.0.0.1 because it doesnt contain any IP SANs.原…

volatile 解析

volatile: 使变量在多个线程间可见 (1)、在java中每一个线程都会有一块工作内存,其中存放着是所有线程共享的主内存的变量值的拷贝。 (2)、当前线程执行时,他在自己的工作内存区操作这些变量。…

NOIP 飞扬的小鸟 题解

题目描述 Flappy Bird是一款风靡一时的休闲手机游戏。玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了水管或者掉在地上的话,便宣告失败。 为了简化问题,我们对游戏规则进…

快速生成自签名证书

这里写目录标题快速生成自签名证书1. certstrap 安装方法2. 快速生成证书命令,下面的条目可以不看3. CA 证书4. 服务端证书5. 客户端证书6. 查看证书7. PKCS 格式证书快速生成自签名证书 生成自签名证书传统工具是 OpenSSL。不过 OpenSSL 不论是其复杂的命令选项, …

ThreadLocal 全面解析

ThreadLocal: 一.对ThreadLocal的理解 1、线程的局部变量,是一种多线程间并发访问变量的解决方案。与其synchronized 等加锁方式不同。 ThreadLocal完全不提供锁,是以空间换时间的手段,为每个线程提供变量的独立副本,那么…

使用 NGINX 作为 HTTPS 正向代理服务器

这里写目录标题1. 使用 NGINX 作为 HTTPS 正向代理服务器1.1. HTTP/HTTPS 正向代理的分类1.2. 为什么正向代理处理 HTTPS 流量需要特殊处理?1.3. NGINX 的解决方案1.3.1. HTTP CONNECT 隧道 (7 层解决方案)1.3.1.1. 历史背景1.3.1.2. NGINX ngx_http_proxy_connect_module 模块…

怎样找到win10电脑调整分区后分区不见的数据

盘符不见是比较常见的数据恢复案例,需要注意,盘符不见后不要再重建新的分区。保护好文件丢失现场,可以最大程度的恢复出文件。具体的恢复方法看正文了解。 工具/软件:流星数据恢复软件 步骤1:先下载并解压程序打开后&a…