`

多线程

 
阅读更多

多线程就是有多个线程同时运行。

线程的生成

new Thread(new Runnable() {

    @Override

    public void run() {

        

    }

}).start();

 

多线程有共用的资源就需要同步(例如,变量,列表);没有共用资源不需要同步。

同步需要使用锁。

锁与锁上的条件(条件wait时会释放该锁,条件notify时会唤醒,条件wait的线程,并且从wait后一句开始执行)。

1.synchronized(是生成锁的工具)

任何对象可作为锁和该锁的条件(锁和锁的条件必须同一对象)

synchronized fun(){} 对函数加锁,锁是this。该类某个对象内互诉,可以使用wait和notify。这个锁上条件也是this

synchronized(this){} 对代码块加锁,锁是this。该类某个对象内互诉,可以使用wait和notify。这个锁上条件也是this

synchronized(xx.class){}对代码块加锁,锁是该类,该类的所用对象互诉。

 

2.Lock(使用更灵活可以,trylock)

ReadWriteLock(读写锁,应对写写互诉,读写互斥,读读不互斥。(实现方法可以是,第一个读者进入加写锁,最后的读者出释放写锁))

锁(Lock lock=new ReentrantLock())和锁的条件( Condition conditionA=lock.newCondition();),一个锁可以有多个该锁的条件。(锁和锁上的条件必须一致)。

lock.lock();(lock.trylock()(如果能获得锁就获得返回true,如果不能获得就返回false不阻塞))

lock.unlock();

 

ReadWriteLock lock = new ReentrantReadWriteLock();  

Lock read = lock.readLock();  

Lock write = lock.writeLock(); 

 

read.lock();

list.get(i);

read.unlock();

 

write.lock();

    list.add("dd",i);

write.unlock();

 

 

3.semaphore(信号量)(实现方法可以是,加锁保护一个整数变量)

Semaphore semaphore = new Semaphore(1);(参数代表资源数量,为1时可以当作锁来用),(也可以代表允许多少个线程访问某个资源)

semaphore.acquire();(如果还有资源,资源减少一个,如果没有则阻塞)

semaphore.release();(释放一个资源)

 

 

同步模式(线程之间协同关系)

1.普通加锁模型(共享的变量都加锁)

2.生产者消费者模型

生产者不断生产产品加入到缓冲区,如果缓冲区满则阻塞。消费者不断地从缓冲区取产品消费,如果缓冲区空则阻塞。

3.读者写者模型

例如。对一个列表读读可以并发。读写不并发,写写不并发。这样可以提高效率。

4.哲学家进餐模型。

在一个饭桌上一个人只能拿起左右两者筷子才能进餐。要防止死锁(例如都同时拿起了左侧的筷子则会死锁)。

可以这样解决,奇数的人,先拿左侧,偶数的人先拿右侧。则不会死锁。

 

死锁:就是线程相互等待,都不能运行。( 是指两个或两个以上的进程在执行过程中,由于竞争资源彼阻塞的现象)

1.资源使用互斥

2.不释放,且请求。

3.不剥夺。

4.循环等待。

 

解决方式:打破人一个条件。(例如,打破循环等待:A B两把锁,让加锁顺序一致。)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics