java并发编程笔记

1,多线程的使用,实现runnable或继承Thread类或者实例化Thread类传入匿名实现Runnable接口的类对象,MultiplyThread类避免锁竞争

2,脏读的概念以及synchronized关键字用法和锁的概念

3,对象锁以及wait和notify用法以及CountDownLanch

4,ConcurrentHashMap的segment概念以及CopyOnWrite类使容器类具有并发性的读写分离概念,CopyOnWriteArrayList.CopyOnWirteArraySet

5,并发Queue,ConcurrentLinkedQMasterueue,采用读写分离实现

6,future模式,用于异步请求,并行存储,包装类收到请求,返回假对象,再偷偷请求真实数据,再返回。获取数据时如果没装载好就使程序阻塞。jdk中封装有future类

7,Master-Worker模式是一种常见的并行计算模式。核心思想是两类进程协助工作,Master负责接收和分配任务,Worker负责处理子任务。Worker各个子线程工作完后将结果返回给Master,Master负责归纳和总结。

8,生产者-消费者模式,消息中间件实现消息堆积

9,线程池的概念,ExecutorService,Executor框架,

newFixedThreadPool(),返回固定数量的线程池,

newSingleThreadExecutor(),创建一个线程的线程池,

newCachedThreadPool()返回一个可根据实际情况调整线程个数的线程池

newScheduleadThreadPool,该方法返回一个ExecutorService对象,但该线程可以指定线程的数量

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime,Timeunit unit(时间单位), workQueue,ThreadFactory,ejectedExecutionHandler)

ejectedExecutionHandler jdk拒绝策略

AbortPolicy 抛异常

CallerRunsPolicy 在调用者线程中运行当前被抛弃的任务

DiscardOldestPolicy 丢弃最老的请求

DiscardPolicy 丢弃无法处理的任务

自定义拒绝策略可以实现RejectedExecutionHandler接口

9.Concurrent.util常用类

CyclicBarrier使用.  子线程调用barrier.await  实例化 CyclicBarrier barrier = new CyclicBarrier(3;

当有三个线程调用await方法后三个线程就会同时开始执行

CountDownLacth(count)用于监听某些初始化操作,初始化后通知主线程继续工作,

使子线程按照一定count由小至大循序执行

Calable和Future的使用

Calable

Future适合在执行耗时很长的操作时使用,提高系统吞吐量

        FutureTask<String> futureTask = new FutureTask<String>(new FutureHandle("Liuao"));//传入实现了Calable接口的类
        ExecutorService excutor = Executors.newFixedThreadPool(2);创建执行线程池
        Future f = excutor.submit(futureTask);在子线程中处理逻辑,主线程继续往下,从而减少等待时间
        System.out.println(futureTask.get());拿到返回结果,如果没有就会阻塞等待子线程执行完毕直到拿到返回值

Semaphore(信号量)限流使用

Semaphore semaphore = new Semaphore(5);

semaphore.acquire();//请求许可

semaphore.release();//释放许可

10,锁

ReentrantLock(重入锁)

ReentrantLock lock = new ReentrantLock();

lock.lock();

lock.unlock();

Lock类 Lock lock = new ReentrantLock();

Condition c = lock.newCondition();获得Condition对象,可通过一个Lock对象产生多个condition进行线程间的交互,可操作部分线程唤醒,condition.singalAll();

公平锁与非公平锁Lock lock = new ReentrantLock(false);默认false非公平

公平则是先调用则先上锁,非公平则是cpu决定,非公平锁性能优于公平锁

Disrupter框架

BlockingWaitStrategy 是最低效的策略,但其对cpu的消耗最小并且在各种环境中提供更加一致的表现

SleepingWaitStrategy 的性能与BlockingWaitStrategy差不多,cpu消耗也差不多,但对生产者线程影响最小,适合异步日志类

YieldingWaitStrategy的性能是最好的,适合于低延迟的系统,在要求极高性能且事件处理线小于cpu逻辑核心数的场景中,使用此策略,例如cpu开启超线程特性(推荐使用)

Disruptor d =new Disruptor<Event(自定义的一个bean)>(EventFactory factory,ringBufferSize,executor,ProducerType,

YiedingWaitStrategy);

d.handlerEventsWith(EventHandler e); //传入一个实现了EventHandler接口的对象,在该对象重写该接口的方法中写处理逻辑

d.start();//启动disruptor

RingBuffer ringBuffer = disruptor.getRingBuffer();

LongEventProducer producer  = new LongEventProducer(ringBuffer);

EventProducer类具体实现

 

 

 

 

 

 

 

 

### 黑马程序员 Java 并发编程 笔记 Java并发编程是一个复杂而重要的主题,涵盖了多线程、同步机制以及高级并发工具等内容。对于希望深入理解这一领域的人来说,找到合适的资源至关重要。 #### 多线程基础概念 在Java中,创建新线程可以通过继承`Thread`类或实现`Runnable`接口来完成。每种方法都有其特点和适用场景[^1]。例如: ```java // 继承 Thread 类的方式 class MyThread extends Thread { @Override public void run() { System.out.println("子线程运行"); } } // 实现 Runnable 接口的方式 class MyRunnable implements Runnable { @Override public void run() { System.out.println("通过 Runnable 创建的子线程"); } } ``` #### 同步控制与锁机制 为了防止多个线程同时访问共享数据而导致的数据不一致问题,可以采用内置锁(`synchronized`)或者显式的锁对象如`ReentrantLock`来进行同步控制[^2]。下面展示了一个简单的自定义锁的例子: ```java public class SpinLock { private final AtomicReference<Thread> atomicReference = new AtomicReference<>(); public void lock() { Thread current = Thread.currentThread(); while (!atomicReference.compareAndSet(null, current)) {} } public void unlock() { Thread current = Thread.currentThread(); atomicReference.compareAndSet(current, null); } } ``` #### 高级并发特性 除了基本的线程管理和同步外,Java还提供了诸如`ExecutorService`框架用于管理线程池;`CountDownLatch`, `CyclicBarrier`等协调器帮助不同线程之间协作;还有像`CompletableFuture`这样的异步处理API。 #### 学习建议 针对想要系统化掌握Java并发编程的学习者来说,《黑马程序员》系列教程是非常好的起点之一。该套教材不仅覆盖了上述提到的基础知识点,还包括了许多实际项目案例分析,有助于加深理解和应用能力。此外,在线平台上的相关视频课程也值得推荐给初学者作为辅助材料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值