并发和并行
并发执行是指在一个时间段内,多个线程使用一个CPU,进行交替的运行。
并行是指在同一时刻,多个线程各自2使用一个CPU,同时进行运行。
线程组
在主线程中创建一个线程对象,它的线程组默认就是主线程线程组。
Thread t = new Thread();
//获取当前线程所属的线程组
ThreadGroup threadGroup = t.getThreadGroup();
System.out.println(threadGroup)
可以指定把当前线程存放到指定的线程组中。
ThreadGroup group = new ThreadGroup("我的线程组");
//指定线程所属的线程组
Thread t = new Thread(group,"t线程");
ThreadGroup threadGroup = t.getThreadGroup();
System.out.println(threadGroup);
线程的状态
New 新建:线程刚被创建,还没调用start方法。
Runnable:线程存活着,并且在尝试去抢占CPU资源。
Blocked:锁阻塞状态,多个线程都要执行方法,并且方法被加了锁,某个线程拿了锁去执行
方法,这时候其他的线程进入锁阻塞状态。
Waiting:无限期等待,需要另外一个线程notify或者notifyall才能唤醒。
Time_Waiting:有限期等待,等时间到了线程就会主动醒过来。
Dead:run方法结束。
线程安全
JVM
内存中的堆区,是一个共享的区域,是所有线程都可以访问的内存空间。
JVM
内存中的栈区,是线程的私有空间,每个线程都有自己的栈区,别的线程无法访问到自己栈区的数据。
多线程环境中,如果有俩个线程并发访问堆区中一个对象中的数据,那么这个数据可能会出现和预期结果不符的情况。
线程同步的效果,就是一段加锁的代码,每次只能有一个拿到锁的线程,才有资格去执行,没有拿到的
锁的线程,只能等拿到锁的线程把代码执行完,再把锁给释放了,它才能去拿这个锁然后再运行代码。