synchronized关键字用法:
可以在方法前加上synchronized关键字,实现对整个方法的同步。
示例:
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
public synchronized int getCount() {
return count;
}
}
public class Main {
public static void main(String[] args) {
Counter c = new Counter();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
c.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
c.decrement();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(c.getCount());
}
}
输出结果:
0
可以使用synchronized块来实现对一段代码块的同步。synchronized块有一个参数,即要锁定的对象。当多个线程访问同一个锁定对象时,只有一个线程可以执行synchronized块中的代码。
示例:
public class Counter {
private int count = 0;
private Object lock = new Object();
public void increment() {
synchronized(lock) {
count++;
}
}
public void decrement() {
synchronized(lock) {
count--;
}
}
public int getCount() {
synchronized(lock) {
return count;
}
}
}
public class Main {
public static void main(String[] args) {
Counter c = new Counter();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
c.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
c.decrement();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(c.getCount());
}
}
输出结果:
0
进程(Process)与线程(Thread)的区别
进程和线程都是程序执行的基本单元,它们都可以执行代码、访问内存,但是它们之间有一些区别。
进程和线程都需要操作系统进行调度,但是进程是操作系统分配资源的基本单位,而线程是CPU调度的基本单位。一个进程可以包含多个线程,线程之间共享进程的资源,但是每个线程有自己的执行栈和局部变量,不同的线程可以并行执行,提高了CPU利用率。
进程有自己独立的内存空间,不同的进程之间的内存是隔离的,一个进程的崩溃不会影响其他进程。而线程共享进程的内存空间,同一个进程中的线程可以直接读写进程中的共享变量。
创建进程的开销比较大,需要分配独立的内存空间,建立进程控制块等,而创建线程的开销比较小,只需要为线程分配执行栈和局部变量即可。多个线程可以共享进程的资源,所以线程的开销比进程小。
由于进程之间的内存是隔离的,一个进程的崩溃不会影响其他进程,因此进程比线程更加安全。而线程共享进程的内存空间,如果一个线程访问了非法地址或者崩溃了,可能会影响到其他线程和进程的稳定性。
Java线程是Java中重要的概念之一,Java中使用Thread类和Runnable接口来实现多线程编程。线程同步是多线程编程中需要注意的问题,Java中使用synchronized关键字来实现线程同步。
进程和线程都是程序执行的基本单元,它们之间有一些区别,包括调度、内存、资源开销和安全性等方面。在编写程序时需要根据具体的需求来选择使用进程还是线程,以实现更好的程序性能和安全性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。