Java & Scala
文章平均质量分 55
语言基础
acethan
这个作者很懒,什么都没留下…
展开
-
Java并发编程之内存模型
C++/C代码都是直接编译成可执行文件的,主要有堆、栈、常量区、文本区等。而java编译成class交给JVM执行,这里开始就和C++很不一样了。 JVM内存结构和JVM的runtime·有关。 Java内存模型和Java并发编程有关。 JVM内存结构包含堆、虚拟机栈、方法区(常量池、字段和方法数据)、本地方法栈、程序计数器和运行时常量池等。 而出现Java内存模型是为了JVM实现遵守这个规范,否则不同的JVM实现可能不一样。JMM最重要的就是重排序、原子性和可见性。 可见性时java代码比较特殊的部分,每原创 2021-03-18 21:54:54 · 56 阅读 · 0 评论 -
java并发编程之线程协作
既然多线程是为了提升效率,共同干活,那相互之间的协作也难免。 main线程起了多个线程,可以用countdownlatch来倒计数,等倒数到零时即可开始往下运行。 类似于限流中的令牌桶,semaphore可以限制线程池同时运行的线程数量。 public class SemaphoreDemo { static Semaphore semaphore = new Semaphore(3); public static void main(String[] args) { E原创 2021-03-18 21:34:56 · 77 阅读 · 0 评论 -
Java并发编程值future
多线程编程中,对于干活得线程不会将任务的返回值带出来,而且对于exception 也只能catch,没法throw。 Java 提供了Callable 接口 public interface Callable<V> { V call() throws Exception; } 实现这个接口的类就是可以被其他线程执行的任务,返回值和异常抛出就很明了了。而且可以和Future 类配合,来了解任务执行情况,或者取消任务,也能获取返回结果。在 ...原创 2021-03-18 15:47:57 · 67 阅读 · 0 评论 -
java并发编程之ThreadLocal
不管用那种语言,在并发编程中遇见的问题都是类似的,只不每种语言提供的方法和工具不一样而已。 对于每个线程独享某个对象或者每个线程独立保存信息的场景,java提供的解决方法是ThreadLocal , 对于线程独享某个对象的例子 public class ThreadLocalDemo { public static ExecutorService threadPool = Executors.newFixedThreadPool(16); SimpleDateFormat dateForma原创 2021-03-18 14:45:16 · 113 阅读 · 0 评论 -
java并发编程之阻塞队列
数据结构中队列就是先进先出的结构,加上点算法可以实现优先队列,再加上线程安全就可以形成下图 这里还多了个阻塞队列,阻塞队列可以凭很生产与消费的速率,即take/put的快慢调节,它是线程安全的,这样就将需要程序员维护的线程安全问题转移到队列上了。 一般数据结构类中都需要定义这个容器的大小,LinkedBlockingQueue 中这个上限值是Integer.MAX_VALUE。 阻塞队列提供了增删方法,但是这些方法可以分为三类,一类是当条件不满足时会抛出异常,一类是不满足条件时会返回bool值,不会抛异常原创 2021-03-18 11:05:55 · 105 阅读 · 0 评论 -
Java并发编程之容器
与C99相比,java还有比较丰富的并发包支持。这样可以按业务选择并发容器,不用自己再手撸一个或者是在用容器时考虑加解锁。 和a++这样的非原子性操作类似,容器元素的put/get操作也是非原子的,多线程中非原子操作就要考虑数据正确性了,当然容器的扩容也有可能导致出现问题, 比如下面这段代码 public class HashMapNotSafe { public static void main(String[] args) { final Map<Integer, St原创 2021-03-18 10:09:45 · 47 阅读 · 0 评论 -
Java并发编程
虽然并发编程在本质上是一样的,但是不同语言的切换也需要去了解一下java的并发编程套路,写一篇总结一下以备忘,是为记。 和C++类似java也有锁Reentrantlock,然后再用condition来做判断。 多线程的问题一般是结果出错/初始化顺序问题/活跃性(活跃性是指活锁和死锁)三种问题。 和C11不用的是,java有线程并发包和线程池,不用再自己手撸线程池。 public static void main(String[] args) { ExecutorService s原创 2021-03-17 22:14:00 · 113 阅读 · 1 评论