多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?
下面简要解释一下原因:
锁定是因为操作不是原子的。让我们用操作一来解释它。看下面两个图。
我这个操作需要
看上面的第二个图,你能很清楚地理解这个过程吗?
锁定是为了确保上述三个步骤是原子操作。
回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。
但是,如果你看第一张图片,因为主内存和本地内存的存在
在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。
添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。
java中多线程常见的几个参数?
java多线程几个常见参数:
睡眠:在指定的毫秒数内使当前正在执行的线程睡眠(暂停执行)。
此操作受系统计时器和计划程序精度和准确性的影响。
线程不会失去任何监视器的所有权。
调用睡眠时不会释放锁。
sleep
javase5引入了一个更可见的sleep(),作为timeunit类的一部分。此方法允许您指定sleep()延迟的时间单位,以便提供更好的可读性。
wait:调用wait挂起线程,直到线程收到notify或notifyall消息。
允许您等待超出当前方法控制范围的条件更改。
线程的执行被挂起,对象上的锁被释放。这意味着另一个任务可以获得锁。
因此在等待期间可以调用对象中的其他同步方法。
我的工作快完成了,我可以让其他线程使用cpu。
当您调用yield时,您还建议其他具有相同优先级的线程可以运行。
任何重要的控制或调整应用程序都不能依赖收益率。
屈服并不意味着退出或暂停。它只是告诉线程调度程序,如果有人需要它,他们可以先得到它。我稍后再执行。没人需要它。我继续
调用yield时,锁没有释放。
中断:中断线程。
thread类包含interrupt()方法,因此您可以中止被阻止的任务。
此方法设置线程的中断状态。
如果线程被阻塞或试图执行阻塞操作,设置线程的中断状态将引发interruptedexception。
引发异常或任何调用时线程已中断(),中断状态将被重置。
如果在执行器上调用shutdownnow(),它将向它启动的所有线程发送中断()调用。
原文标题:java线程锁有几种 多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?,如若转载,请注明出处:https://www.tzjingsheng.com/wenda/53437.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「豪运号」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。