精华内容
下载资源
问答
  • java并发笔记

    2021-01-14 23:33:53
    java并发笔记一之java线程模型 https://www.cnblogs.com/yuhangwang/p/11295940.html java并发笔记二之证明 synchronized锁 是否真实存在 https://www.cnblogs.com/yuhangwang/p/11295940.html java并发笔记...
    展开全文
  • Java并发笔记

    2019-06-30 10:36:46
    地址: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html
    展开全文
  • Java 并发笔记

    2017-11-07 19:24:06
    无锁并发编程:将数据的ID按照hash算法取模分段,不用线程处理不同段的数据; CAS算法 ::Compare and Swap 原理是CPU的cas指令, 通过缓存锁,保证操作的原子性, 例如 i++, 局限是只能保持一个变量的操作原子性 ...

    减少上下文切换(上下文切换:CPU在多个线程间切换执行)途径:

    1. 无锁并发编程:将数据的ID按照hash算法取模分段,不用线程处理不同段的数据;
    2. CAS算法 ::Compare and Swap 原理是CPU的cas指令, 通过缓存锁,保证操作的原子性,
      例如 i++, 局限是只能保持一个变量的操作原子性
      缓存锁与总线锁相比,优势在于,总线锁将CPU和内存的通道锁住,导致其他其他处理器无法处理内存数据,而所谓“缓存锁定”,就是如果缓存在处理器缓存行中内存区域在LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会起缓存行无效
      在i++操作中,当CPU1修改缓存行中的i时使用缓存锁定,那么CPU2就不能同时缓存了i的缓存行。

    3. 使用最少线程

    4. 协程。单线程中实现多任务的调度,并维持多个任务的切换

    Java的锁
    由低到高: 无锁,偏向锁,轻量级锁,重量级锁

    占有锁对象的:通过CAS操作将ThreadId ,放入 对象的对象头的 Mark Word的位置

    偏向锁:如果出现锁竞争,先暂停有锁线程,检查这个线程是否活跃,

    volatile变量的内存读写:

    • 线程A写一个volatile变量,实质上是给接下来要读这个变量的线程发了消息
    • 线程B读一个volatile变量,实质上是接受了之前某线程发出的消息
    • 线程A写一个volatile变量,线程B又读了,实质上就是线程A通过主内存向线程B发送了一个消息

    并发工具类

    等待多线程完成 :CountDownLatch
    最简单的方法是 Thread 的join方法, 用于让当前线程等待join线程结束。
    而使用CountDwoLatch,构造方法需要传一个int值 ,表示需等待N个点, 提供await()方法,阻塞等待,
    如果不阻塞,可用await(long time,TimeUnit unit);

    展开全文
  • java 并发笔记

    2016-01-28 13:15:10
    Thread.yield() 是对线程调度器(Java线程机制的一部分,可以将CPU从一个线程转到另一个线程)的一种建议,它在声明:“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机。...

    使用线程机制是一种建立透明的,可扩展的程序的方法。


    Thread.yield()  是对线程调度器(Java线程机制的一部分,可以将CPU从一个线程转到另一个线程)的一种建议,它在声明:“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机。


    可以再一个任务的内部,通过调用Thread,currentThread()来获得对驱动该任务的Thread对象的引用。”

    2. 从任务中产生返回值

    线程中Runnable是执行工作的独立任务,它不返回任何值。如果你希望任务在完成时能够返回一个值,那么要实现Callable接口而不是Runnable接口。

    Callable是一种具有类型参数的泛型,他的类型参数表示的是从方法call()(而不是run())中返回的值,并且必须使用ExecutorService.submit()方法调用。

    3. 优先级

    线程的优先级将该线程的重要性传递给了调度器。尽管CPU处理现有线程集的顺序是不确定的,但是调度器将倾向于让优先权高的线程先执行。这不意味着优先权较低的线程得不到执行(优先权不会导致死锁)。优先权较低的线程仅仅是执行的频率较低。
    优先级是在run()的开头部分设定的,不要在构造器中设置。 setPriority(),getpriority()。
    在调整优先级的时候,只是用 MAX_PRIORITY, NORM_PRIORITY,MIN_PRIORITY。
     线程

    4.后台线程

    所谓后台(daemon)线程,是指在程序运行的时候再后台提供一种通用服务的线程。 当所有的非后台线程结束时,程序也就终止了,同时会杀死进程中的所有后台线程。

    使用 xxxx.setDaemon(true)来把线程设置为后台线程。


    展开全文
  • public static void main(String[] args) throws ExecutionException, InterruptedException { ForkJoinExample example = new ForkJoinExample(1, 10000); ForkJoinPool forkJoinPool = new ForkJoinPool();...
  • public synchronized static void fun() { // ... }
  • // 获取Java线程管理MXBean ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean(); // 不需要获取同步的monitor和synchronizer信息,仅获取线程和线程堆栈信息 ThreadInfo[] threadInfos = ...
  • 菜鸟学习java并发笔记

    2016-12-04 12:29:32
    121
  • void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { //遍历所有桶 while(null != e) { Entry<K,V> next = e.next;...
  • static final int SHARED_SHIFT = 16; static final int SHARED_UNIT = (1 << SHARED_SHIFT); static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1; static final int EXCLUSIVE_MASK = (1 <...
  • 最近在学习 Java 并发的相关知识,发现 synchronized 锁对 Integer 等基本类型的包装类没有效果,示例如下: public class AccountingSyncBad implements Runnable { static volatile Integer i = 0; public ...
  • // 尝试获取同步状态,当前状态符合预期,进行CAS设置同步状态 protected boolean tryAcquire(int arg); // 独占式释放同步状态,同步队列中的线程将有机会获取同步状态 protected boolean tryRelease(int arg);...
  • synchronized(对象) { //改变条件 //对象.notifyAll(); }

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,041
精华内容 4,016
关键字:

java并发笔记

java 订阅