旅游网站 功能商标注册类别45类明细
2025/12/28 1:10:55 网站建设 项目流程
旅游网站 功能,商标注册类别45类明细,如何自己做引流推广,网站制作 公司资质多线程环境中#xff0c;‌临界区#xff08;Critical Section#xff09;是指一次只能由一个线程执行的代码段#xff0c;这些代码通常涉及对共享资源#xff08;如变量、数据结构、文件或数据库连接#xff09;的访问或修改。临界区的存在是为了解决并发控制中的两大核…多线程环境中‌临界区Critical Section是指一次只能由一个线程执行的代码段这些代码通常涉及对共享资源如变量、数据结构、文件或数据库连接的访问或修改。临界区的存在是为了解决并发控制中的两大核心问题。‌ 1数据不一致性‌如果多个线程同时对共享资源进行写操作可能会破坏数据的完整性导致其状态与预期不符。‌ 2竞态条件程序的执行结果依赖于线程调度和执行的偶然顺序这使得程序行为变得不可预测难以调试。image为了保护临界区Java提供了多种互斥Mutual Exclusion机制其中synchronized关键字是最常用且强大的工具之一。synchronized实现互斥的基础是Java中的每一个对象都可以作为锁这个锁是排他的在任意时刻只有两种状态被占用和未被占用。当线程请求一个由其他线程持有的锁时请求的线程会被阻塞直到锁被释放。这种机制确保了在任何时刻只有一个线程能够进入临界区执行代码。synchronized 有两种使用方式。1synchronized修饰方法锁是当前实例对象。它修饰的方法称为同步方法。public synchronized void method() {// ...}2synchronized修饰代码块锁是synchronized括号里配置的对象。它修饰的代码块称为同步代码块。public void method() {synchronized (this) {// ...}}synchronized与happens-before关系在Java内存模型中对synchronized关键字建立如下的happens-before关系释放锁的操作happens-before之后对同一把锁的获取的锁操作。class LockingExample {int x 0;public synchronized void set() { // 1x; // 2} // 3public synchronized void get() { // 4int i x; // 5// ......} //6}假设线程A执行set()方法随后线程B执行get()方法。假设线程A获取锁执行set()方法在set()方法中对共享变量x自增1然后释放锁。线程B获取锁执行get()方法在get()方法中读取变量x并赋值给本地变量i然后释放锁。根据happens-before规则可以确定线程A对x的修改happens-before线程B对x的读取从而保证了数据的一致性。这个过程建立的happens-before关系可以分为3类。1程序次序规则1 happens-before 22 happens-before 34 happens-before 55 happens-before 62监视器锁规则3 happens-before 43happens-before的传递性规则 happens-before 5。上述happens-before关系的图形化表现形式如下。imagesynchronized内存语义synchronized释放锁的内存语义当线程释放锁时Java内存模型会把该线程对应的本地内存中的共享变量刷新到主内存中。A线程释放锁后共享数据的状态如图所示。imagesynchronized获取锁的内存语义当线程获取锁时Java内存模型会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取共享变量。B线程释放锁后共享数据的状态如图所示。image对比锁释放-获取与volatile写-读的内存语义可以看出锁释放与volatile写有相同的内存语义锁获取与volatile读有相同的内存语义。这表明synchronized不仅提供了互斥访问的同步机制还具备了volatile的内存可见性保障。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询