精华内容
下载资源
问答
  • 1认知线程安全机制:由于线程它是共享进程里面所有资源,当然这里面就会包括虚拟内存里面所有东西(包含全局变量,堆内存,映射内存及程序段落等),它也继承了进程当中所有资源(文件描述符,信号资源等),便...

    e386fe917e68ad1e05b3f572f905ad3e.gif

    1认知

    线程安全机制:

    由于线程它是共享进程里面所有的资源,当然这里面就会包括虚拟内存里面所有的东西(包含全局变量,堆内存,映射的内存及程序段落等),它也继承了进程当中所有的资源(文件描述符,信号资源等),便会出现一种情况:同一个资源有可能会出现多个线程访问及更改。这是一件比较尴尬的事情,我们可以假设,如果你有一个余额,你可以去花费这笔余额,你的女朋友也可以支付宝或者是微信来花费你这笔余额,这个时候如果稍有不慎,大家就会产生逻辑冲突。所以提出了我们线程的同步互斥机制,来解决这个安全漏洞。

    7ed9651d41914b16e3c7e5d97d89e1b4.png

    互斥锁:

    由posix给我们提供的一个线程的配合的“锁”资源,达到一种逻辑:当我们需要去操作共享资源的时候,我们自己主动去跟系统拿这个互斥锁(上锁操作),这个时候如果别人也想要过来拿这把锁的时候,便陷入睡眠,一直等到先拿了这把互斥锁的人还给系统(解锁操作)后,下一个人才会被唤醒,然后拿走这把锁,以保证我们操作这个公有资源的时候,有且只有一个人在同一时间段里可以访问,其他人如果访问则陷入睡眠。

    互斥锁使用非常简便,但他也有不适用的场合——假如要保护的共享资源在绝大多数的情况下是读操作,就会导致这些本可以一起读的线程阻塞在互斥锁上,资源得不到最大的利用,但可以用读写锁解决这个问题。下篇笔记--读写锁。

    2相关API

    互斥锁的初始化函数:                   

    #includeintpthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t*restrict attr);

    参数:

           Mutex:需要初始化的互斥锁

           Attr:这个参数设置为NULL,代表按照默认的互斥锁进行初始化

    返回值:

           成功则返回0,失败返回一个错误值,errno不会被设置

     互斥锁的销毁函数:                 

        #include              intpthread_mutex_destroy(pthread_mutex_t *mutex);

    参数:

         Mutex:销毁的线程锁

    返回值:

          成功则返回0,失败返回一个错误值,errno不会被设置

    互斥锁的操作函数:                 

    #includeintpthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_trylock(pthread_mutex_t*mutex);intpthread_mutex_unlock(pthread_mutex_t*mutex);

    函数功能:

           pthread_mutex_lock:获取指定的互斥锁(加锁操作),如果这个互斥锁已经被别人使用了(被别人加锁操作了),则你的线程会在这里陷入睡眠

            pthread_mutex_trylock:尝试去获取指定的互斥锁,如果这个互斥锁已经被别人使用了,他不会在这里睡眠,直接返回错误

           pthread_mutex_unlock:解除互斥锁的占用(解锁操作),如果这个时候有人因为获取这把锁而陷入睡眠,则会将最先去获取这把锁的人唤醒,让其继续操作这把锁

    参数:

            mutex:需要操作的互斥锁

      返回值:

             成功则返回0,失败则返回一个错误值,errno不会被设置

    7ed9651d41914b16e3c7e5d97d89e1b4.png

    总结:

    1,什么时候我们需要用到互斥锁:一旦操作一个共有资源,我们都应该加锁,以确保逻辑没有漏洞。

    2,为了防止死锁(线程在执行的过程中,获取了互斥锁,而刚好被取消掉,你的锁来不及解开就会造成死锁),我们会在获取锁之后的操作中,加上pthread_cleanup_push跟pthread_cleanup_pop函数,包裹进线程的锁操作中

    3代码展示

    对互斥锁的操作无非就是:初始化、加锁、解锁、销毁。下面的代码如何使用互斥锁来互斥地访问标准输出,来理解互斥锁的正确使用:

    #include #include #include #include #include #include int count = 10;void *thread(void *arg){    pthread_mutex_t *mutex = arg;      while(1)    {        pthread_mutex_lock(mutex);//加锁操作=把锁拿过来            printf("tid=%ld, in thread count=%d\n", pthread_self(), count);            if(count == 0)        {              pthread_mutex_unlock(mutex);//解锁操作=把锁还回去              break;          }        sleep(1);//代表你女朋友花钱      count -= 1;        pthread_mutex_unlock(mutex);//解锁操作=把锁还回去    }        return   NULL;}void *init_mutex(void *arg){    pthread_mutex_t *mutex = arg;      pthread_mutex_init( mutex, NULL);//制造一把互斥锁      return NULL;}int main(void){    int retval;    pthread_t tid[3];      pthread_mutex_t mutex;        pthread_create(tid, NULL, init_mutex, &mutex);        pthread_join(tid[0], NULL);          pthread_create(tid, NULL, thread, &mutex);    pthread_create(tid+1, NULL, thread, &mutex);    pthread_create(tid+2, NULL, thread, &mutex);      pthread_join(tid[0], NULL);    pthread_join(tid[1], NULL);    pthread_join(tid[2], NULL);        pthread_mutex_destroy(&mutex);//销毁这把互斥锁      return 0;}

    0eb0e81e616c57995ce4c182baecb5ad.png

    记录点点滴滴的笔记欢迎关注,共同学习

    小浩笔记

    66898afcfe5aa7b57a239df6b0187d4d.png
    展开全文
  • Java HashMap 是不是线程安全的?为什么? 请用 Java 写个单例模式 知道几种 GC 算法? 如何实现一个高效单项列表逆向输出? 数据湖和数据仓库有什么区别? 详细介绍下 Flink Checkpoint 执行机制(分布式快照...

    一面

    • 简单介绍一下自己以及自己做过的项目;
    • Java HashMap 是不是线程安全的?为什么?
    • 请用 Java 写个单例模式
    • 知道几种 GC 算法?
    • 如何实现一个高效的单项列表逆向输出?
    • 数据湖和数据仓库有什么区别?
    • 详细介绍下 Flink 的 Checkpoint 执行机制(分布式快照)
    • 算法题:寻找两个正序数组的中位数

    二面

    • 如何在两个进程间共享数据?线程呢?
    • 如何在 main 函数里面等待一个线程执行完毕?
    • 用MapReduce手写一个wordcount,
    • 用 MapReduce TopK 怎么实现?
    • Hudi、Iceberg 和 Delta Lake 哪个熟悉?它们之前有什么区别知道吗?
    • 请简述 Hudi 的读写流程。
    • 布隆过滤器的原理知道吗?(在回答 Hudi 写数据的时候提到布隆过滤器,所以面试官问了)。
    • 算法题:合并两个有序链表。三个有序链表合并?K 个呢?

    三面

    • Spark Shuffle 读写原理说下,和 MapReduce 的 Shuffle 有什么区别?
    • Hudi 支持流批一起处理吗?他是怎么实现的?
    • Iceberg 知道吗?实现原理你知道吗?
    • Iceberg 的时间旅行是怎么实现的?什么场景下要使用它?
    • Hudi 和 Iceberg 你怎么选?为什么。
    • 算法题:一辆公交车,有 m 站,最多坐 n 人,输入一路上的票信息(即上车下车站),输出会不会超载。

    四面

    • 说一下你熟悉的设计模式?
    • synchronized 和 ReentrantLock 区别是什么?
    • 都知道哪些分布式一致性算法?挑一个你熟悉的说下其原理。
    • Join 的实现有哪几种?场景是哪些?
    • 一条 SQL 从提交到拿到结果都经历了什么?
    • 说下你理解的数据湖?
    • Hudi、Iceberg 和 Delta Lake 怎么选择?
    • 请简述一下 Flink CDC 原理

    小编把阿里巴巴、腾讯、美团等大厂的Java和大数据面试题整理成了电子书和资源,目录如下: 资源 链接: https://pan.baidu.com/s/1ifHfofjawqD9jn2lvoh0NA 提取码: h79x 另外,微信搜索关注【import_bigdata】,回复【资源】,还有几百G大数据资源下载!

    欢迎关注,《大数据成神之路》系列文章

    展开全文
  • 存储过程的安全及性能优化 存储过程分类  系统存储过程  自定义存储过程  SQL Server使用者编写的存储过程  扩展存储过程  动态链接库(DLL)函数的调用看,主要用于客户端和服务器端之间进行通信  exec...
  • JDK1.8下qq邮箱发邮件出现握手失败

    千次阅读 2017-02-18 10:59:39
    1.  问题现象 (1).... 在jdk1.8环境下,用javamail....(1)这个问题是jdk导致,jdk1.8里面有一个jce.jar包,安全机制导致qq邮箱访问https会报错。 3.  处理步骤 (1)处理这个错误有两种方法:

    1.    问题现象

    (1).    jdk1.8环境下,用javamail.jar做邮件发送,其他邮箱都能正常发送邮件,但qq邮箱出现了一下问题。

    2.    原因分析

    (1)这个问题是jdk导致的,jdk1.8里面有一个jce.jar的包,安全性机制导致qq邮箱的访问https会报错。

    3.    处理步骤

    (1)处理这个错误有两种方法:

    A.   Oracle官网下载local_policy.jarUS_export_policy.jar这两个包:

    a.    这两个jar包的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

    b.    下载后在  %JAVA_HOME%\jre\lib\security下替换这两个包。

    B.    jdk换成1.71.6

    4.    效果

    (1)更换jar后发送邮件成功。

     

    展开全文
  • 下次需要需要该模块值就直接从里面拿了。</li><li>模块 id 直接通过数组下标去一一对应,这样能保证简单且唯一,通过其它方式比如文件名或文件路径方式就比较麻烦,因为文件名可能出现...
  • 在java 1.5时就提供了concurrent包,java.util.concurrent 并发包下所有类都是实现了 fail-safe(安全-失败)机制,下面我要来了解一下并发包atomic下变量类 : 这个包里面提供了一组原子变量类:

    在java 1.5时就提供了concurrent包,java.util.concurrent 并发包下的所有类都是实现了 fail-safe(安全-失败)机制,下面我要来了解一下并发包atomic下的变量类  :

    这个包里面提供了一组原子变量类:

     java.util.concurrent.atomic中的类可以分成4组:

    • 标量类(Scalar):AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference
    • 数组类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray
    • 更新器类:AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
    • 复合变量类:AtomicMarkableReference,AtomicStampedReference

    • Atomic包里的类基本都是使用Unsafe实现的包装类。

    /**
     * 来看AtomicInteger提供的接口。

     //获取当前的值
     
     public final int get()
     
     //取当前的值,并设置新的值
     
      public final int getAndSet(int newValue)
     
     //获取当前的值,并自增
     
      public final int getAndIncrement() 
     
     //获取当前的值,并自减
     
     public final int getAndDecrement()
     
     //获取当前的值,并加上预期的值
     
     public final int getAndAdd(int delta) 

    实例:

    import java.util.concurrent.atomic.AtomicInteger;
    
    public class AtomicIntegerTest {
    
    	static AtomicInteger ai = new AtomicInteger(1);
    
    	public static void main(String[] args) {
    		System.out.println(ai.getAndIncrement());
    		System.out.println(ai.get());
    	}
    
    }
    结果输出:

    1
    2

    Atomic包提供了三种基本类型的原子更新,但是Java的基本类型里还有char,float和double等。那么问题来了,如何原子的更新其他的基本类型呢?Atomic包里的类基本都是使用Unsafe实现的,让我们一起看下Unsafe的源码,发现Unsafe只提供了三种CAS方法,compareAndSwapObject,compareAndSwapInt和compareAndSwapLong,再看AtomicBoolean源码,发现其是先把Boolean转换成整型,再使用compareAndSwapInt进行CAS,所以原子更新double也可以用类似的思路来实现。

    原子更新数组类

    通过原子的方式更新数组里的某个元素,Atomic包提供了以下三个类:

    • AtomicIntegerArray:原子更新整型数组里的元素。
    • AtomicLongArray:原子更新长整型数组里的元素。
    • AtomicReferenceArray:原子更新引用类型数组里的元素。

    AtomicIntegerArray类主要是提供原子的方式更新数组里的整型,其常用方法如下

    • int addAndGet(int i, int delta):以原子方式将输入值与数组中索引i的元素相加。
    • boolean compareAndSet(int i, int expect, int update):如果当前值等于预期值,则以原子方式将数组位置i的元素设置成update值。

    实例代码如下:

    public class AtomicIntegerArrayTest {
    
    	static int[] value = new int[] { 1, 2 };
    
    	static AtomicIntegerArray ai = new AtomicIntegerArray(value);
    
    	public static void main(String[] args) {
    		ai.getAndSet(0, 3);
    		System.out.println(ai.get(0));
                    System.out.println(value[0]);
    	}
    
    }

    输出

    3
    1

    AtomicIntegerArray类需要注意的是,数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元素进行修改时,不会影响到传入的数组。

    原子更新引用类型

    原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类。Atomic包提供了以下三个类:

    • AtomicReference:原子更新引用类型。
    • AtomicReferenceFieldUpdater:原子更新引用类型里的字段。
    • AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子的更新一个布尔类型的标记位和引用类型。构造方法是AtomicMarkableReference(V initialRef, boolean initialMark)

    AtomicReference的使用例子代码如下:

    public class AtomicReferenceTest {
    
    	public static AtomicReference<user> atomicUserRef = new AtomicReference</user><user>();
    
    	public static void main(String[] args) {
    		User user = new User("conan", 15);
    		atomicUserRef.set(user);
    		User updateUser = new User("Shinichi", 17);
    		atomicUserRef.compareAndSet(user, updateUser);
    		System.out.println(atomicUserRef.get().getName());
    		System.out.println(atomicUserRef.get().getOld());
    	}
    
    	static class User {
    		private String name;
    		private int old;
    
    		public User(String name, int old) {
    			this.name = name;
    			this.old = old;
    		}
    
    		public String getName() {
    			return name;
    		}
    
    		public int getOld() {
    			return old;
    		}
    	}
    }

    输出

    Shinichi
    17

    原子更新字段类

    如果我们只需要某个类里的某个字段,那么就需要使用原子更新字段类,Atomic包提供了以下三个类:

    • AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。
    • AtomicLongFieldUpdater:原子更新长整型字段的更新器。
    • AtomicStampedReference:原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于原子的更数据和数据的版本号,可以解决使用CAS进行原子更新时,可能出现的ABA问题。

    原子更新字段类都是抽象类,每次使用都时候必须使用静态方法newUpdater创建一个更新器。原子更新类的字段的必须使用public volatile修饰符。AtomicIntegerFieldUpdater的例子代码如下:

    public class AtomicIntegerFieldUpdaterTest {
    
    	private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater
    			.newUpdater(User.class, "old");
    
    	public static void main(String[] args) {
    		User conan = new User("conan", 10);
    		System.out.println(a.getAndIncrement(conan));
    		System.out.println(a.get(conan));
    	}
    
    	public static class User {
    		private String name;
    		public volatile int old;
    
    		public User(String name, int old) {
    			this.name = name;
    			this.old = old;
    		}
    
    		public String getName() {
    			return name;
    		}
    
    		public int getOld() {
    			return old;
    		}
    	}
    }
    输出:

    10
    11

    转载http://ifeve.com/java-atomic/

    展开全文
  • HashTable是线程安全的HashMap,里面的方法都是用synchronized修饰过的,跟HashMap有以下不同之处: 初始容量不同,HashMap是16,HashTable是11 HashMap可以存储值为null的元素,而HashTable不可以 HashMap的迭代器...
  • 我们知道,数组是比较安全的,因为定义数组时候,规定了里面存储元素类型,如果在int类型数组里添加了double类型数据则会出现编译失败,如: class ArrayDemo2{ public static void main(String[] args){ ...
  • CLQ底层存储基于链表,头节点为哨兵节点,里面的数据域(item)为空。插数据时从尾节点插入,取数据时从头节点获取。相对于LinkedBlockingqueue(简称LBQ队列)采用读写各一把锁的机制保证线程安全,CLQ队列采用自旋...
  • Burp Suite 暴力破解演示

    千次阅读 2017-09-11 11:06:55
    弱口令是安全问题里面最为严重问题之一。 可以进行暴力破解也是有条件限制。 1.没有验证码,有验证码就不好进行有效暴力破解。 2.没有多次登录失败后,禁止登录的机制 3.没有禁止同IP多次尝试登录。 等等。 ...
  • 糖果软件

    2014-08-03 20:08:35
    里面的粉碎机粉碎要删掉的文件,选高级 / 高级工具 集 / 文件粉碎机。 有的人说 “把 word 原文件关掉就可以了 ~ ” 。 这种方法我试过, 不管用, 还是删不掉。 或是尝试网上几种方法: 一、常规解决办法:...
  • VCSA 5.5升级至VCSA6.0

    2017-11-15 16:25:00
    整个升级过程工作原理其实是系统在esxi主机上新建一个VCSA6.0的虚拟机,然后通过内部机制将原有VCSA5.5里面的数据复制到VCSA6.0环境,这种机制比较安全,即使升级失败,原有VCSA也可以照常工作,不会影响原有VCSA的...
  • 这种minor失效导致整个系统不可用的失败,是SOA一大硬伤。 <p><img alt="richardson-microservices-part3-threads-blocked-1024x383" src=...
  • git学习

    2020-10-30 10:12:35
    ③ Repository: 仓库区(或版本库),就是安全存放数据位置,这里面有你提交到所有版本数据。其中HEAD指向最新放入仓库版本 ④ Remote: 远程仓库,托管代码服务器,可以简单认为是你项目组中一台电脑...
  • java study(线程终止)

    2020-06-10 19:33:17
    想要终止一个线程的时候, 不推荐使用使用java里面的stop(), destory()以及一些过期的方法, 我们可以使用标志变量来控制让线程自行终止, 这相对来说是比较安全的一种方式. package com.smile.test.t
  • uni-app基础知识整理

    2021-05-04 16:55:03
    (2)在微信开发者工具中设置里面==》安全设置==》服务端口打开; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bzh7R0kn-1620118485475)(C:\Users\Administrator\AppData\Roaming\...
  • 例二:在windows xp下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内存。该内存不能为 “written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。解决方法:这...
  • 更为安全</li><li>支持 POST 请求方式</li><li>CORS 是一种新型跨域问题解决方案,存在兼容问题,仅支持 IE 10 以上</li></ol> 这里只是对 CORS 做一个简单介绍,如果想更详细地了解其原理...
  • SSO-WebDemo

    2013-08-12 20:25:57
    在面向服务的架构中,服务和服务之间,程序和程序之间的通讯大量存在,服务之间的安全认证是SOA应用的难点之一,应此建立“单点登录”的系统体系能够大大简化SOA的安全问题,提高服务之间的合作效率。 2 单点登陆的...
  • redisStudy.zip

    2019-10-28 02:09:29
    但是redis事务并不支持回滚,即可以两个命令可以同时提交执行,但是如果有失败,成功也不会回滚 5.你们公司使用是什么集群模式 看你写项目经验,如果你们公司数据量特别大,公司用缓存牛逼,就说Redis...
  • java面试题

    2018-04-27 19:55:38
    答:Struts2每次请求的时候都会创建一个action实例,这样会保证线程的安全。Struts1只是在第一次请求的时候创建一个action实例,以后每次相同的请求都直接从内存中去读取,它是单例模式,安全性较差。 Struts2是...
  • Web开发+java+ssh框架

    2012-03-19 19:44:38
    面回贴情绪有点激动,希望谅解,我不是因为有人批评Hibernate而感到不快,而是因为帖子里面的观点实在让我觉得荒谬。不管觉得Hibernate好也吧,不好也吧,我唯一觉得 遗憾的是,在中文论坛里面找不到一个对...
  • asp.net知识库

    2015-06-18 08:45:45
    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...
  • 4.1.5 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 4.1.6 JAVA8ConcurrentHashMap为什么放弃了分段锁,有...
  • 例二:在windows xp下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内 存。该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

安全失败机制里面的安全失败