

我们通过上面的代码发现,相同的票出现了多次,出现了超出范围的票,那是因为线程执行时,有随机性。(造成线程安全问题)
此时我们可以利用同步代码块将操作共享数据的代码锁起来

注意此处锁对象我们可以传递当前类的字节码,因为字节码是唯一的

同步方法;

我们发现这样的锁全是自动的,那有没有办法可以手动设置锁呢?

死锁的现象:
当锁镶套时,有可能出现死锁现象
生产者和消费者(消费者等待的情况):
(生产者等待的情况):


阻塞队列:

注意此处可能会出现打印多次 厨师做了一碗面和面条的字样,因为ArrayBlockingQueue实现类中的put和take方法的底层是已经加了锁的,而此时打印厨师做了一碗面和面条的字样处于锁的外面,因此它们将会抢占cpu的执行权,它们运行的概率是随机的。
线程的六种状态:(Java中没有定义运行状态,因为当线程抢走了cpu的执行权,JVM将会把线程交给操作系统去执行,类似如果手机被抢走,手机的维修状态我们就不用管了)


文章讨论了Java中线程安全问题,特别是由于线程执行的随机性导致的重复票问题。解决方案包括使用同步代码块确保对共享数据的操作是线程安全的。此外,提到了死锁现象,特别是在锁嵌套的情况下。文章还举例说明了生产者消费者模型,并指出ArrayBlockingQueue在处理并发时已内置锁机制,但打印输出可能因竞争CPU执行权而不有序。最后,简述了线程的六种状态,强调Java中线程的运行状态由操作系统管理。
236

被折叠的 条评论
为什么被折叠?



