网站后台管理系统用什么软件做,产品备案查询,帮人做网站好挣吗,重庆市建设工程信息网 施工许可文章目录 前言一、synchronized关键字通用在下面四个地方#xff1a;1.1synchronized修饰实例方法1.2synchronized修饰静态方法#xff1a;1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3… 文章目录 前言一、synchronized关键字通用在下面四个地方1.1synchronized修饰实例方法1.2synchronized修饰静态方法1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3可重入 三.同步互斥访问3.1同步互斥访问3.2Java中实现同步互斥访问的方法3.3Java中为什么要提供两种同步器synchronized 和 Lock 总结 前言
提示这里可以添加本文要记录的大概内容 在Java当中synchronized通常是用来标记一个方法或者代码块。在Java当中被synchronized标记的代码或者方法在同一个时刻只能够有一个线程执行被synchronized修饰的方法或者代码块。因此被synchronized修饰的方法或者代码块不会出现数据竞争的情况也就是说被synchronized修饰的代码块是并发安全的。 提示以下是本篇文章正文内容下面案例可供参考
一、synchronized关键字通用在下面四个地方
1.1synchronized修饰实例方法
public class SynchronizedExample {// 实例变量private int count 0;// 同步实例方法public synchronized void increment() {// 在多线程环境中只有一个线程能够进入这个方法count;}// 非同步方法public void nonSynchronizedMethod() {// 这个方法没有使用 synchronized 关键字多个线程可以同时访问}public static void main(String[] args) {SynchronizedExample example new SynchronizedExample();// 创建多个线程同时访问同一个实例的 synchronized 方法Thread thread1 new Thread(() - {for (int i 0; i 5; i) {example.increment();System.out.println(Thread 1 - Count: example.getCount());}});Thread thread2 new Thread(() - {for (int i 0; i 5; i) {example.increment();System.out.println(Thread 2 - Count: example.getCount());}});// 启动线程thread1.start();thread2.start();}// 获取 count 的方法public int getCount() {return count;}
}
increment 方法使用 synchronized 关键字修饰确保在同一时间内只有一个线程可以进入该方法防止多线程并发访问导致数据不一致。 nonSynchronizedMethod 方法没有使用 synchronized 关键字因此多个线程可以同时访问可能导致竞态条件race condition和数据不一致。 main 方法中创建了两个线程分别调用 increment 方法来递增 count 变量。 getCount 方法用于获取 count 的值。
1.2synchronized修饰静态方法
当 synchronized 修饰静态方法时它锁定的是整个类而不是实例。这意味着在同一时间内只有一个线程能够访问该静态方法无论创建了多少个类实例。以下是一个使用 synchronized 修饰静态方法的简单示例
public class SynchronizedStaticExample {// 静态变量private static int count 0;// 静态同步方法public static synchronized void increment() {// 在多线程环境中只有一个线程能够进入这个静态方法count;}// 非同步方法public void nonSynchronizedMethod() {// 这个方法没有使用 synchronized 关键字多个线程可以同时访问}public static void main(String[] args) {SynchronizedStaticExample example1 new SynchronizedStaticExample();SynchronizedStaticExample example2 new SynchronizedStaticExample();// 创建多个线程同时访问同一个静态方法Thread thread1 new Thread(() - {for (int i 0; i 5; i) {example1.increment();System.out.println(Thread 1 - Count: example1.getCount());}});Thread thread2 new Thread(() - {for (int i 0; i 5; i) {example2.increment();System.out.println(Thread 2 - Count: example2.getCount());}});// 启动线程thread1.start();thread2.start();}// 获取 count 的方法public int getCount() {return count;}
}
increment 方法使用 synchronized 关键字修饰确保在同一时间内只有一个线程可以进入该静态方法。 nonSynchronizedMethod 方法没有使用 synchronized 关键字因此多个线程可以同时访问可能导致竞态条件race condition和数据不一致。 main 方法中创建了两个类实例但由于 increment 方法是静态的它们共享同一个静态方法因此在同一时间内只有一个线程能够访问。 getCount 方法用于获取静态变量 count 的值。
1.3synchronized修饰实例方法的代码块
当 synchronized 修饰实例方法时它锁定的是对象实例确保在同一时间内只有一个线程能够访问该方法。如果有多个实例每个实例都有独立的锁。以下是一个使用 synchronized 修饰实例方法的简单示例
public class SynchronizedInstanceExample {// 实例变量private int count 0;// 同步实例方法public synchronized void increment() {// 在多线程环境中只有持有当前对象实例锁的线程能够进入这个方法count;}// 非同步方法public void nonSynchronizedMethod() {// 这个方法没有使用 synchronized 关键字多个线程可以同时访问}public static void main(String[] args) {SynchronizedInstanceExample example1 new SynchronizedInstanceExample();SynchronizedInstanceExample example2 new SynchronizedInstanceExample();// 创建多个线程同时访问同一个实例方法Thread thread1 new Thread(() - {for (int i 0; i 5; i) {example1.increment();System.out.println(Thread 1 - Count: example1.getCount());}});Thread thread2 new Thread(() - {for (int i 0; i 5; i) {example2.increment();System.out.println(Thread 2 - Count: example2.getCount());}});// 启动线程thread1.start();thread2.start();}// 获取 count 的方法public int getCount() {return count;}
}
increment 方法使用 synchronized 关键字修饰确保在同一时间内只有持有当前对象实例锁的线程能够进入该方法。 nonSynchronizedMethod 方法没有使用 synchronized 关键字因此多个线程可以同时访问可能导致竞态条件race condition和数据不一致。 main 方法中创建了两个类实例每个实例都有独立的锁因此它们的 increment 方法互不影响。 getCount 方法用于获取实例变量 count 的值
1.4synchronized修饰静态方法的代码块
当 synchronized 修饰静态方法时它锁定的是类的 Class 对象确保在同一时间内只有一个线程能够访问该静态方法。以下是一个使用 synchronized 修饰静态方法的简单示例
public class SynchronizedStaticExample {// 静态变量private static int count 0;// 静态同步方法public static synchronized void increment() {// 在多线程环境中只有一个线程能够进入这个静态方法count;}// 非同步方法public void nonSynchronizedMethod() {// 这个方法没有使用 synchronized 关键字多个线程可以同时访问}public static void main(String[] args) {SynchronizedStaticExample example1 new SynchronizedStaticExample();SynchronizedStaticExample example2 new SynchronizedStaticExample();// 创建多个线程同时访问同一个静态方法Thread thread1 new Thread(() - {for (int i 0; i 5; i) {SynchronizedStaticExample.increment();System.out.println(Thread 1 - Count: SynchronizedStaticExample.getCount());}});Thread thread2 new Thread(() - {for (int i 0; i 5; i) {SynchronizedStaticExample.increment();System.out.println(Thread 2 - Count: SynchronizedStaticExample.getCount());}});// 启动线程thread1.start();thread2.start();}// 获取 count 的方法public static int getCount() {return count;}
}
increment 方法使用 synchronized 关键字修饰确保在同一时间内只有一个线程能够进入该静态方法。 nonSynchronizedMethod 方法没有使用 synchronized 关键字因此多个线程可以同时访问可能导致竞态条件race condition和数据不一致。 main 方法中创建了两个类实例但由于 increment 方法是静态的它们共享同一个静态方法因此在同一时间内只有一个线程能够访问。 getCount 方法用于获取静态变量 count 的值。
2.读入数据
代码如下示例
data pd.read_csv(https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv)
print(data.head())该处使用的url网络请求的数据。 二.Sychronized关键特性
2.1互斥
synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized 中时, 其他线程如果也执行到同一个对象 synchronized 就会阻塞等待. 进入 synchronized 修饰的代码块, 相当于 加锁 退出 synchronized 修饰的代码块, 相当于 解锁
2.2 刷新内存
synchronized 的工作过程:
获得互斥锁从主内存拷贝变量的最新副本到工作的内存执行代码将更改后的共享变量的值刷新到主内存释放互斥锁
2.3可重入
看到的这个例子很形象 在 Java 中synchronized 关键字具有可重入性这意味着如果一个线程已经获得了某个对象的锁那么它可以再次请求该对象的锁而不会被阻塞。可重入性使得同一个线程在执行一个方法或代码块时可以再次进入同步锁定的代码区域而不会被自己已经持有的锁所阻塞。
这种机制是为了防止由于递归调用或者方法内部调用其他同步方法而导致的死锁。如果不支持可重入性那么在同一线程中多次调用同步方法就会因为持有同一个锁而产生死锁。
public class ReentrantExample {public static void main(String[] args) {ReentrantExample example new ReentrantExample();example.outerMethod();}public synchronized void outerMethod() {System.out.println(Outer Method);innerMethod();}public synchronized void innerMethod() {System.out.println(Inner Method);}
}
三.同步互斥访问
3.1同步互斥访问
在多线程编程中通常会有多个线程同时访问一个资源的情况同步互斥访问就是在同一时间只能有一个线程对同一资源进行访问。
3.2Java中实现同步互斥访问的方法
同步互斥访问的解决办法是设计一个同步器对多个线程同时访问同一个共享、可变资源的情况这个资源我们称之其为临界资源这种资源可能是 对象、变量、文件等 同步器采用的方案都是序列化访问临界资源。即在同一时刻只能有一个线程访问临 界资源。 共享资源可以由多个线程同时访问。 可变资源可以在其生命周期内被修改。 Java中目前有 synchronized 和 Lock ReentrantLock。
3.3Java中为什么要提供两种同步器synchronized 和 Lock
synchronized在1.5版本时的状况这是因为在jdk1.5版本的时候jdk官方就提供出了 synchronized 锁但是在1.5版本的时候synchronized 锁的加锁方式只有一个就是通过内部对象Monitor(监视器锁)实现基于进入与退出Monitor对象实现方法与代码块同步监视器锁的实现依赖底层操作系统的Mutex lock互斥锁实现它是一个重量级锁性能较低也就是比较消耗性能。 Lock锁的出现由于 synchronized 锁的性能不大好加的锁都是重要级别的锁涉及到线程之间的状态切换要从用户态切换到内核态所以就有一个人设计了Lock锁在当时Lock锁的性能要比 synchronized 好很多。 synchronized锁的优化后来jdk官方就对synchronized锁进行了优化成了现在这个样子我感觉真的基本和Lock差不多了。
总结
好了今天的blog就到此为止期待大佬们的三连和评论