avatar
文章
464
标签
16
分类
76

Believe it

Believe it

java并发编程12-集合的线程安全类
发表于2020-04-12|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 集合的线程安全类遗留的线程安全类 Hashtable,Vector直接把同步加到方法上 修饰的安全集合 装饰器模式,Syncronize* JUC安全集合Blocking型 大部分实现基于锁并提供阻塞的方法 CopyOnWrite 在修改的时候会拷贝一份 Concurrent 使用CAS优化,使用多个锁,但是是弱一致性,如迭代的时候得到的内容是旧的,求大小未必100%准确,读取也是弱一致性 ConcurrentHashMap 细粒度锁 12LongAdder value = concurrentHashMap.computeIfAbsent(word,(key)->new LongAdder());value.increment(); HashMap并发死链 在jdk7中链表是头插法,插入16,35,1,得到了1->35->16 线程A准备扩容 e 1->35-> ...
java并发编程11-JUC
发表于2020-04-12|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial JUCAQS   AbstractQueuedSynchronizer 是阻塞式的锁和相关的同步器工具的框架 ReentrantLock如何重入   用一个变量记录重入了多少次 NonfairSynclock   cas ,成功就吧ouner改为自己,否则acquire,把自己放进链表中 acquire   tryacquire,成功就结束,失败的话还会尝试几次,然后才park,并为前驱标记,让前驱记得唤醒自己,如果曾经被打断的话,会被忽略,再次进入aqs队列,得到锁以后会打断自己来再次重新打断 unlock   调用release release   如果成功,unpark唤 ...
java并发编程10-异步模式
发表于2020-04-12|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 异步模式-工作线程线程不足导致饥饿 有两个线程A,B,任务有两种,上菜和做菜,显然上菜要等待做菜,如果AB都在执行上菜,就没有更多的线程做菜了,这就导致了AB在死等,注意这不是死锁, 所以不同的任务类型应该用不同的线程池 创建多少线程 过小导致CPU不充分利用,过大导致上下文切换占用更多内存 CPU密集型运算 CPU核数+1个线程最好,+1是当某个线程由于缺页中断导致暂停的时候,额外的线程就能顶上去 IO密集型运算 核数* 期望CPU利用率 * (CPU计算时间+等待时间) / CPU计算时间
java并发编程9-JDK线程池
发表于2020-04-12|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial JDK的线程池 线程池状态,RUNNING,SHUTDOWN(不会再接受新任务了),STOP(立刻停止),TIDYING(任务执行完毕,即将TERMINATED),TERMINATED 构造函数1public ThreadPollExecutor(int corePoolsize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) 核心线程数量 最大线程数量 就急线程生存时间 时间单位 阻塞队列 线程工厂: 给线程起个名字 拒绝策略 拒绝策略 AbortPolicy 让调用者抛出异常 CallerRunsPolicy 让调用者运行任务 ...
java并发编程8-自定义线程池
发表于2020-04-12|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 自定义线程池 把main看作任务的生产者,把线程看作任务的消费者,这时候模型就建立出来了 于是我们需要一个缓冲区,采取消费正生产者模式,然后让消费者不断消费,并在适当的时候创建新的消费者,如果所有任务都做完了,就取消消费者 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 ...
网易笔试第三题
发表于2020-04-11|实习笔试
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 给一个数字字符串S,一个数字m,你需要计算出S有多少个划分,讲他划分为S1,S2,S3,。。 且每个数都是m的倍数,答案对1e9+7取模例如 123456 2可以划分为1234561234|5612|345612|34|56 最近发现这题不对劲,有新想法,先上代码 123456789101112131415string s;int m;cin>>s>>m;const int mod = 1e9+7;int cnt=0;int cur=0;for(char ch:s){ cur = (cur*10ll+ch-'0')%m; if(cur==0) cnt++;}int ans=0;if(cur=0) ans=0;else ans=1;for(int i=1;i<cnt;i++) ans=(ans*2)%mod;cout ...
java并发编程7-不可变设计
发表于2020-04-11|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 不可变就是线程安全 如String 拷贝构造函数 之间赋值 char[]构造 拷贝一份(保护性拷贝) 子串 如果下标起点和母串起点相同,则之间引用过去,否则保护性拷贝(不明白为啥不共用) 享元模式 最小化内存的使用,共用内存 包装类 valueOf, 比如Long如果在-128到127之间,就使用一个cache数组,又如String串池,BigDecimal和BigInteger的某些数组 保护 千万要注意这些类的函数组合起来操作就不一定安全了,需要用原子引用类来保护 数据库连接池1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859package com.wsx;import lombok.Data;import org.sl ...
java并发编程6-无锁并发
发表于2020-04-11|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial CAS compareAndSet(prev,next);无锁,无阻塞 为什么效率高 失败的话会重新尝试,但是锁会进行上下文切换,代价大 原子整形AtomicInteger123incrementAndGet();getAndAdd(5);updateAndGet(value -> value*10); 原子引用 AtomicReference 不能解决ABA问题 AtomicStampedReference 版本号机制 AtomicMarkableReference True和false 原子数组字段更新器 可以保护类的成员 compareAndSet(obj,expect,update); 原子累加器 和原子整形一样,但是只支持累加并且效率更高 缓存行伪共享 缓存中的数据是按照行分的,要失效就一起失效 有数据a和b,他们被分到了一个行中,线程1改变a导致线程2的行失效,线程2改 ...
java并发编程5-Java内存
发表于2020-04-11|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial JMM Java Memory Model 原子性: 保证指令不会收到线程上下文切换的影响 可见性: 保证指令不会受到cpu缓存的影响 有序性: 保证指令不会受到cpu指令并行优化的影响 可见性 java线程都有自己的高速缓存区,是内存的一个子集,下面的测试,不会停止运行,尝试使用volatile解决,当然加入synchronized罩住他也可以。System.out.println也可以 12345678910111213141516boolean flag = true;@Testpublic void test8() throws InterruptedException { Logger logger = LoggerFactory.getLogger(ThreadTest.class); Thread thread = new Thread(() -&g ...
java并发编程4-同步与互斥
发表于2020-04-10|LanguageJavaJava并发
nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial synchronized 锁住对象,放在静态方法前为锁类,放在普通方法前为锁类的对像。使用管程实现 线程安全类 String, Integer, StringBuffer,Random,Vector,Hashtable,juc; 加锁 把对象头的hash、Age和对象的指针放进自己的栈中,让对象头的hash、Age,位置指向自己的栈, 这时候来了另一个线程也想拿到锁,但是他肯定会失败,失败以后他就申请重量级锁,让对象头再次改变为指向管程, 当原来当线程想要释放锁的时候,依然使用cas,但是肯定失败,他发现现在的锁已经变成了重量级锁了。 自旋优化 不阻塞,使用自旋,如果自旋多次失败就阻塞了 偏向锁 可以在对象头中加入线程的ID,然后对象的锁就被这个线程所持有了。程序启动3秒以后启动偏向锁,可以通过VM参数来改变 禁用偏向锁 -XX: -UseBiasedLocking hashcode ...
1…161718…47
avatar
fightinggg
O ever youthful, O ever weeping
文章
464
标签
16
分类
76
Follow Me
公告
This is my Blog
最新文章
智慧的疆界:从图灵机到人工智能2023-05-17
Transformer2023-03-28
2023你好2023-02-06
VPN与代理那些事2022-07-24
CPU架构介绍2022-07-19
分类
  • ACM238
    • 刷题实战56
      • CodeForces7
      • bzoj4
      • hdu19
      • uoj1
      • 比赛15
      • 洛谷3
标签
AI AspectJ CPU docker 结构体中的引用 SpringFox使用 跟我一起写编译器 GPT linux指令 读书,HTTP 读书 flag Transformer Proxy VPN nginx
归档
  • 五月 20231
  • 三月 20231
  • 二月 20231
  • 七月 20223
  • 五月 20221
  • 三月 20221
  • 二月 20221
  • 一月 20221
网站资讯
文章数目 :
464
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2023 By fightinggg
框架 Hexo|主题 Butterfly