详解详解Java多线程编程中的线程同步方法多线程编程中的线程同步方法
主要介绍了Java多线程编程中的线程同步方法,使用synchronized关键字创建线程同步方法是实现线程同步的关
键,需要的朋友可以参考下
1、多线程的同步:、多线程的同步:
1.1、同步机制:、同步机制:
在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生。所以引入了同步机制:在线程使用一个资
源时为其加锁,这样其他的线程便不能访问那个资源了,直到解锁后才可以访问。
1.2、共享成员变量的例子:、共享成员变量的例子:
成员变量与局部变量:
成员变量:
如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作,这多个线程是共享一个成员变量的。
局部变量:
如果一个变量是局部变量,那么多个线程对同一个对象进行操作,每个线程都会有一个该局部变量的拷贝。他们之间的局部变
量互不影响。
下面举例说明:
实现了Runnable的线程类:
class MyThread3 implements Runnable{
//两个线程操作同一个对象,共享成员变量
//int i;
@Override
public void run() {
//两个线程操作同一个对象,各自保存局部变量的拷贝
int i = 0;
while(i<100){
System.out.println(i);
i++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
在main方法中用两个线程操作同一个对象:
public static void main(String[] args) {
MyThread3 myThread = new MyThread3();
//下面两个线程对同一个对象(Runnable的实现类对象)进行操作
Thread thread = new Thread(myThread);
Thread thread2 = new Thread(myThread);
//各自保存局部变量的拷贝,互不影响,输出200个数字
thread.start();
thread2.start();
}
这里如果把i变成成员变量,则输出100个数字。
1.3、共享资源导致的读取错误、共享资源导致的读取错误
下面举个例子,两个线程共用一个Number对象,通过Number类的getNumber方法获取数据,读取数据并改写时,发现了重
复读操作:
首先创建一个Number类:
class Number{
private int number = 10;
public String getNumber(int i){
if(number > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();