(28人评价)
JUC
价格 免费

原子性问题:

一:i++的原子性问题

int i =10;

i = i++ ; //10

实际上分为三个 操作“读改写"

int temp = i;

i = i+1;

i =temp;

JUC里面新增了原子变量,atomic

CAS算法 

内存值 v

预估值 a

更新值 b

当且仅当 v==a 时,v=b,否则,将不做任何操作

[展开全文]

这模拟的比较循环10次,乘以101,都还有true吗

[展开全文]

线程八锁:非静态对象的锁默认为this,静态方法的锁为Class,即应用加载器。同一个实例,同时只能有一个锁被持有。

[展开全文]

静态方法:

 

给Class加锁,该

[展开全文]

闭锁操作:

线程执行完成才执行

 

[展开全文]

volatile  

当多个线程进行操作共享数据时,可以保证内存中的数据可见。

 

每次从主存中读取

 

volatile不具备互斥性和原子性

[展开全文]

线程池体系结构:

java.util.concurrent.Executor

   |--ExecutorService  子接口:线程池的主要接口

        |--ThreadPoolExecutor  线程池的实现类

        |--ScheduledExecutorService 子接口,负责线程的调度

             |--ScheduledThreadPoolExecutor  继承ThreadPoolExecutor  ,实现ScheduledExecutorService

 

线程池参数:

coreSize

maxSize

 

[展开全文]

为了避免虚假唤醒,应该总是在循环中使用wait

[展开全文]

可见性和互斥性(原子性)是两个完全不同的概念

原子变量可以很简单地实现变量原子性而不需要同步操作,其内部基于volatile、cas实现

[展开全文]

       线程都有自己的缓存,区别于主存。volatile关键字主要解决两个线程间的共享数据的内存可见性,实现线程能立刻知道另外的线程对共享数据的改变。volatile可以认为操作的就是主存中的数据,而一般的都是操作的自己的缓存。

     相较于syncronized是一种较为轻量级的同步策略。syncronized关键字也能实现,但是效率较低。

     volatile不具备“互斥性”

     volatile不能保证变量的“原子性”

[展开全文]

volatile 关键字:

 当多个线程进行操作共享数据时,可以保证内存中的数据可见,相较于synchronized是一种较为轻量级的同步策略。

 

不具备 互斥性

不能保证变量的原子性

 

[展开全文]

线程调度

实例

class ThreadPoolDemo implements Runnable{

public void run(){

system.out.println("1");}

}

ThreadPoolDemo tpd = new ThreadPoolDemo

1.创建线程池

ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);

2.为线程池中的线程分配任务

Future<Integer> resule = pool.schedule(new Callable<Integer>(){},3,TimeUnit.SECONDS);

第一个数据意思为传入线程实例,第二个数据为延迟时间,第三个数据为延迟单位

3.关闭线程池

pool.shudown();

[展开全文]

线程池

概念与作用和数据库连接池差不多

 

java.util.concurrent.Executor  负责线程的使用与调度的根接口

子接口:ExecutorSrvice 线程池的主要接口

实现类:ThreadPoolExecutor

子接口:ScheduledExecutorService 负责线程的调度

实现类:ScheduledThreadPoolExecutor         继承了ThreadPoolExecutor,实现了ScheduledExecutorService

 

newFixedThreadPool();创建固定大小的线程池。返回值是ExecutorSrvice

newCachedThreadPool();缓存线程池,线程池的数量不固定,可以根据需求自动更改数量。返回值是ExecutorSrvice

newSingleThreadExecutor();创建单个线程池,线程池中只有一个线程。返回值是ExecutorSrvice

 

newScheduledThreadPool();创建固定大小的线程,可以延迟或定时执行任务。返回值是ScheduledExecutorService

实例测试:17:53

实例:

class ThreadPoolDemo implements Runnable{

public void run(){

system.out.println("1");}

}

ThreadPoolDemo tpd = new ThreadPoolDemo

1.创建线程池

ExecutorService pool = Executors.newFixedThreadPool(5);

2.为线程池中的线程分配任务

pool.submit(tpd);

3.关闭线程池

pool.shudown();

 

 

 

[展开全文]

读写锁ReadWriteLock

由于在对同一个数据的操作中,读操作可以有多个线程同时读并且线程安全,而多个线程同时写操作则不安全。所以读写锁是针对这种的一个锁,可以增加程序的效率。

示例:

ReadWriteLock lock = new ReentrantReadWriteLock();//读写锁实例

lock.readLock.lock();//上读锁

lock.readLock().unlock();//释放读锁

tip:读写锁的释放锁步骤也要放在finally中。

[展开全文]

Condition控制线程通信

在Condition中,与wait,notify和notifyAll方法对应的分别是await,signal,signalAll

Condition实例实质上被绑定到一个锁上,要为特定的Lock实例获得Condition实例,要使用newCondition()方法。

例子:

Lock lock = new ReentrantLock(); //获取一个锁的实例

Condition condition = lock.newCondition(); //获取一个Condition实例并绑定到锁上。

此后当对线程操作时使用  condition.await();

condition.signal();

condition.signalAll();

[展开全文]

解决多线程安全问题的方法

1.同步代码块(隐式锁)

2.同步方法(隐式锁)

3.lock锁 (显式锁)

Lock lock = new ReentrantLock();

上锁:lock.lock();

释放锁:lock.unlock(); 释放锁的代码一定要放到finally中以防上了的锁未被释放。

 

[展开全文]
业界大牛亲自授课
前沿技术实时更新
足不出户学编程
关注尚硅谷微信 一键下载全部视频教程

关注尚硅谷微信

一键下载全部视频教程