1.start()和run()方法区别?
start()方法开启线程,无需等待run方法体代码执行完毕而直接执行下面的代码.
run()方法是线程体,包含了要执行的这个线程的内容,run()方法运行结束,此线程随即终止.如果直接调用run方法,程序中依然只有主线程这一个线程.
2.synchronized与lock的区别?
synchronized是java的关键字,在jvm层面上,lock是一个类
synchronized,假如A获得线程,B线程一直等待.lock获取锁,线程可以不用一直等待.
synchronized无法判断锁的状态, lock可以判断.而且lock是可重入,公平的.
3.synchronized和volatile的区别?
volatile只能使用在变量级别,synchronized可以使用在变量, 类, 方法上.
一个线程修改volatile修饰的共享变量,其它线程可以立即可见.synchronized修饰的变量,只能在当前线程访问,其它线程阻塞.
volatile不会造成线程的阻塞.synchronized可能会造成线程的阻塞.
4.sleep()方法和wait()方法的区别?
sleep()方法属于Thread类中,wait()方法是属于Obejct类.
调用sleep()方法,线程不会释放对象锁,而wait()方法会释放.
线程内数据共享问题
ThreadLocal 如 银行转账,需要在一个事务中完成,使用相同的数据库连接对象,而又是两个不同的账户对象.
多线程共享数据:
1.多个线程行为一致,共同操作一个数据,共用一个实现Runnable接口对象,把数据设为全局的静态变量即可.
2.多个线程行为不一致,共同操作一个数据,需要使用不同的Runnable对象,把共享数据放到另一个对象中,然后将这个对象传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象身上去完成,这样即可.