多线程的数据安全:保证数据的完整性
同步线程的方法
修改之后的同步代码
synchronized除了同步代码块意外,也可以用来同步方法,功能是类似的,如:
同步线程的方法
class MyThread implements Runnable{ int i=100; public void run(){//复写run方法 while(true) { //打印当前的线程的名称和i变量的值 System.out.println(Thread.currentThread().getName() + i); i--; Thread.yield(); if(i<0) break; } } }
class Test{ public static void main(String args[]) { MyThread myThread = new MyThread; //生成两个Thread对象,但是这两个对象共用一个线程体 Thread t1 = new Thread(myThread); Thread t2 = new Thread(myThread); //每一个线程都有名字,可以通过Thread对象的setName()设置线程的名字 //同样也可以使用getName方法获取线程的名字 t1.setName("线程A"); t2.setName("线程B"); //分别启动两个线程 t1.start(); t2.start(); } }运行结果如下
Thread-->B11 Thread-->A10 Thread-->B9 Thread-->A8 Thread-->B7 Thread-->A5 Thread-->B5 Thread-->A4 Thread-->B3 Thread-->A2 Thread-->B1 Thread-->A0发现数据丢失了和重复错误,这就是多线程共用同一个数据的时候会出现的错误,此时就需要用到线程同步。
修改之后的同步代码
public void run(){ while(true) { /*使用同步代码块*/ synchronized(this){ System.out.println(Thread.currentThread().getName() + i); i--; Thread.yield();/*让出CPU*/ if(i<0) break; } } }synchronized在使用时候一旦一个线程获得了一个对象的同步锁,那么这个对象上面所有被同步的代码都将被锁住,不能被其他线程使用
synchronized除了同步代码块意外,也可以用来同步方法,功能是类似的,如:
public synchronized void fun() { }By Urien 2018年4月14日 14:02:27