针对Java多线程编程中synchronized线程同步的教程,我将提供如下攻略:
1. 什么是synchronized线程同步?
在Java中,多线程编程中的线程会因为多进程调度的因素而产生混乱,造成程序不可预期的后果。为了保证线程的执行顺序和互斥性,我们通常采用synchronized关键字对某一段代码进行加锁,只有当一个线程执行完这段被加锁的代码之后,其他线程才能继续执行这段代码。这就是synchronized线程同步的作用。
2. synchronized关键字的使用方法
(1) synchronized修饰方法:当一个方法被synchronized修饰时,调用该方法的线程必须先获得该方法所属对象的锁,才能进入方法体执行,其他线程必须等待该线程执行完该方法之后才能获取该锁。
public class MyThread implements Runnable {
private int count;
public synchronized void run() {
for (int i = 0; i < 5; i++) {
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
(2) synchronized修饰代码块:当一个代码块被synchronized修饰时,只有当前线程获得了该代码块所属对象的锁,才能执行这段代码,其他线程必须等待该线程执行完该代码块之后才能获取该锁。
public class MyThread implements Runnable {
private static int count;
public void run() {
synchronized (MyThread.class) {
for (int i = 0; i < 5; i++) {
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
3. 采用synchronized线程同步的实现方式
示例1:多线程下对共享变量count进行操作,需要进行线程同步,保证结果正确。
public class MyThread implements Runnable {
private static int count;
private void increment() {
synchronized (MyThread.class) {
for (int i = 0; i < 5; i++) {
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
}
public void run() {
increment();
}
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
t1.start();
t2.start();
}
}
示例2:两个线程交替打印1-100,需要进行线程同步,保证输出顺序的正确性。
public class MyThread implements Runnable {
private int count = 0;
private synchronized void printOdd() {
while (count < 100) {
if (count % 2 == 1) {
System.out.println(Thread.currentThread().getName() + ":" + count);
count++;
notify();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
private synchronized void printEven() {
while (count < 100) {
if (count % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ":" + count);
count++;
notify();
} else {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void run() {
if (Thread.currentThread().getName().equals("odd")) {
printOdd();
} else if (Thread.currentThread().getName().equals("even")) {
printEven();
}
}
public static void main(String[] args) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt, "odd");
Thread t2 = new Thread(mt, "even");
t1.start();
t2.start();
}
}
以上就是关于Java多线程编程中synchronized线程同步的教程攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java多线程编程中synchronized线程同步的教程 - Python技术站