java线程数据同步,JAVA基础知识之java多线程时数据同步问题

按步骤写写我个人的理解吧,底层的东西,有点枯燥,

1、java线程堆栈概念:JAVA启动每个线程时,都会为该线程在内存中分配一个线程私有的堆栈,jdk1.5以后该堆栈的大小默认是1M,原先的是512K ;在JAVA的启动参数中可以通过-ss参数指定每个线程的堆栈大小。如果堆栈太小,可能会报堆栈内存溢出错误(StackOverflowError);如果线程数太多,可能就会报OutOfMemoryError: unable to create new native thread ;如何计算一个进程的最大线程数,回头专门写博文详细描述;

2、java线程堆栈作用:java线程在运行过程中,代码中用到任何变量数据,都是将这些数据先拷贝一份到线程堆栈里面,再使用内存堆栈中所拷贝的数据。这一点非常非常的重要,java并不是根据该变量指针或内存地址直接读写数据!

3、线程间数据通信:这时你会问,如果按上面所说的,每个线程都使用拷贝的数据,那多线程访问时,数据不是乱套了?不用担心,JAVA中有抽象一个叫主内存的东东,所有的数据都放在主内存中,每个线程使用数据前,从这个主内存拷贝出去,修改后,再从线程堆栈写回主内存中。这时你会问,主内存是啥?实际上是个抽象的东西,它涵盖了JVM缓存,CPU缓冲区,寄存器等等..

4、线程同步:从第3点可以看出,大家拷贝来复制去的,如果多个线程同时对同一变量读写操作,那不是乱套了?答案是的。所以JAVA搞了一个synchronized这个关键字,jdk1.5后又搞了一个lock,原理很简单:就是他保证在这些区块中的变量,同时只有一个人在读写。这个由JAVA本身控制,开发人员不必关心,但开发人员一定要关心着两个同步关键字的性能问题;

5、java同步和数据库事务的比喻:在数据库操作上,我们修改了一条数据,如果不提交的话,别的数据库连接是无法对该数据进行操作的;java的变量也是同样的道理,此时你不会担心synchronized或lock过大?导致另外一块代码需要长时间等待运行呢?这个倒不要过分担心,java中的同步类似数据连接设置了autocommit=true属性,一旦发生修改则立即提交,别的线程马上就可以获得锁进行修改。

6、明白了原理,也知道了要避免什么了,那就是不需要同步的,就不要同步,同步范围能小的,则尽量小;

7、volatile关键字,这个关键字说实话在我的工作历程中还没用到过,它的意思是保证每个线程使用它时,是取的最新的数据。但毕竟不是锁,可以应用的领域,大家自己想想吧.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值