java学习笔记 多线程(三)线程池、Lock对象、原子访问

线程池

每一个线程的启动和结束都是比较耗费时间和资源的,线程池的思想呢就是设定一定的线程数量等待调用,有需要的时候就调用

没有需要的时候就等待着。有了线程池的存在,整个程序的运行过程,都不需要创建新的线程,而是循环使用线程池中已经存在

的线程。

java自带的线程池ThreadPoolExecutor在包java.util.concurrent下面。

使用例子(参数说明):

package Multiplethread;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestPoolthread {
	public static void main(String[] args) {
		ThreadPoolExecutor threadpool = new ThreadPoolExecutor(10,15,60,TimeUnit.SECONDS,new
				LinkedBlockingQueue<Runnable>());
		/* 第一个参数10:代表在这个线程池里面初始化了10个线程
		 * 第二个参数15:代表当10个线程不够用了之后,会自动增加到最多15个线程。
		 * 第三个参数60,结合第四个参数TimeUnit.SECONDS,代表当有多线程休息了60s后,就会回收,
		 * 保持线程池里的10个。
		 * 第五个参数:用来存放任务的集合。LinkedBlockingQueue是一个基于链表的线程安全的阻塞
		 *  队列该方法是阻塞方法,线程安全方法,将其值放入到队列中,如果队列满了,则一直等待直
		 *  到队列有可放入的位置为止
		 */
		threadpool.execute(new Runnable(){
			public void run() {
				System.out.println("任务1");
			}
		});
	}
}

Lock对象

lock对象是用来实现同步效果的,和前面学习过的synchronized类似。

lock是一个接口,为了使用lock对象需要用到:

Lock lock = new ReentrantLock();

lock()

其中的lock()方法 表示当前线程占用该对象,与synchronized作用类似,不同的是,lock必须自己手动unlock()释放锁

不然会造成死锁,所以为了保证释放操作的进行,一般会写finally。

trylock()

lock对象有一个很精华的地方就是trylock()方法,意思是在尝试占有多少时间之后,还不能占有成功的话,那就主动放弃占有

这样相比synchronized,造成死锁的可能性就小很多啦。但是因为trylock()可能会占有成功,也可能会失败,那么在unlock的时候

就需要判断之前trylock()是否占有成功,不然也会抛出异常。

交互

与synchronized类似,lock对象也能进行线程交互,但是需要通过lock对象得到一个Condition对象,然后通过调用condition对象中

的await、signal、signalALL方法,来实现线程的交互。

这三个方法,类似对比synchronized的wait、notify、notifyAll使用。

总结lock和synchronized的区别:

1、lock对象是一个接口,是代码层面的实现,而synchronized是一个关键字,是内置的语言实现。

2、lock有trylock()方法,可以选择性的获取锁,一段时间获取不到可以放弃,这样可以避免死锁。

3、synchronized在发生异常或者代码块结束的时候会自动释放锁。而lock必须手动释放,不释放也

     会造成死锁。

原子访问

所谓的原子性操作即不可中断的操作,比如赋值操作

int i = 5;

原子性操作的本身是线程安全的。

但比如i++这个行为,实际上是由3个原子操作组成的。

步骤1:取出i的值

步骤2:i + 1

步骤3:把新的值赋予i

这三个步骤,每一个步骤都是一个原子操作,意思是每一个步骤完事之后,都可能会有其他线程过来取值或者其他操作

这样就不是线程安全的了。

如i++,i--,i=i+1 这些都是非原子性操作

解决这个问题呢有下面一个类:

Atomiclnteger类

在包java.util.concurrent.atomic中,

Atomicinteger提供了各种自增、自建等方法,这些方法都是原子性的。

学习网址:https://how2j.cn/p/4012

发布了58 篇原创文章 · 获赞 20 · 访问量 5214

猜你喜欢

转载自blog.csdn.net/qq_41658124/article/details/103369262