什么是线程
用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,
只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),
但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;
1.2 多线程:
同一个进程中的多个线程之间可以并发执行!
2.线程的五种状态
a、新建状态(new)
b、就绪状态(Runnable)
c、运行状态(Running)
d、阻塞状态(Blocked)
e、死亡状态(Dead)
3.多线程同时访问同一个对象有时会抛出拒绝访问异常
如果使用synchronized去访问可以解决这个问题但是在
某种特别情况(比如位置信息保存到数据库里)就产生高并发,导致大量重复数据被写入数据库
那么怎么保证数据的唯一性要怎么解决呢
先讲原因 举个简单的例子
在for(1-10)循环里面创建一个新线程并实现run()我们需要的是1-10有序的排列下来
可是结果却不是
4.针对这个问题我查询资料了解到“锁”来控制
所谓的锁分为公平锁和非公平锁
在这里把线程比作人来说,不加锁的话就相当于一群人在食堂抢饭无序而混乱
非公平锁呢就是所有的线程开始排队一次只有一个线程执行,其余线程等待该线程完成后在一起抢夺第二个打饭的机会
公平锁呢就是所有线程开始排队先1号然后2号有序
简称来说呢就是非公平锁抢夺对对象的使用权
公平锁安线程排序,排序使用对象;
5.synchronized 和 Lock
synchronized就是非公平锁(可重入锁-递归锁)
在这里给大家举例一个Lock就是公平锁(可重入锁-递归锁)
创建Lock lock = new ReentrantLock(true);//公平锁
使用Lock的时候需要先打开锁然后在try catch finaly 我们需要在finaly里面手动释放锁
6.关于java锁还有很多包括
可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁
有兴趣的同学可以私下查询-----听说面试官对java锁也很感兴趣哦.




