首页 > 代码库 > 4个线程例子,2个线程对同一数字加法运算另外2个线程对同一共享数字减法运算

4个线程例子,2个线程对同一数字加法运算另外2个线程对同一共享数字减法运算

package com.saic.grape.controller;

public class Data {
    private int j = 0;

    /**
     * 加法
     */
    public synchronized void inc() {
        j++;
        System.out.println("inc 加法运算>>" + j);
    }

    /**
     * 减法
     */
    public synchronized void dec() {
        j--;
        System.out.println("dec 减法运算>>" + j);
    }

}


package com.saic.grape.controller;

public class IncThread implements Runnable{

    private Data data;
    public IncThread(Data data) {
        super();
        this.data = http://www.mamicode.com/data;
    }
    /**
     * 加法运算20次
     */
    @Override
    public void run() {
        for(int i=0;i<20;i++){
            data.inc();
        }
    }
    

}


package com.saic.grape.controller;

public class DecThread implements Runnable{

    private Data data;
    public DecThread(Data data) {
        super();
        this.data = http://www.mamicode.com/data;
    }
    /**
     * 减法运算20次
     */
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            data.dec();
        }
    }

}



package com.saic.grape.controller;

public class Test {

    public static void main(String[] args) {
        Data data=http://www.mamicode.com/new Data();
        //加法20次运算
        Thread thInc1=new Thread(new IncThread(data));
        Thread thInc2=new Thread(new IncThread(data));
        thInc1.start();
        thInc2.start();
        //减法20次运算
        Thread thDec1=new Thread(new DecThread(data));
        Thread thDec2=new Thread(new DecThread(data));
        thDec1.start();
        thDec2.start();
    }

}

运行结果(数据共享读写无错误)

Thread-0加法运算>>1
Thread-0加法运算>>2
Thread-0加法运算>>3
Thread-0加法运算>>4
Thread-0加法运算>>5
Thread-0加法运算>>6
Thread-0加法运算>>7
Thread-0加法运算>>8
Thread-0加法运算>>9
Thread-0加法运算>>10
Thread-0加法运算>>11
Thread-0加法运算>>12
Thread-0加法运算>>13
Thread-0加法运算>>14
Thread-0加法运算>>15
Thread-0加法运算>>16
Thread-0加法运算>>17
Thread-0加法运算>>18
Thread-0加法运算>>19
Thread-0加法运算>>20
Thread-3减法运算>>19
Thread-3减法运算>>18
Thread-3减法运算>>17
Thread-3减法运算>>16
Thread-3减法运算>>15
Thread-3减法运算>>14
Thread-3减法运算>>13
Thread-3减法运算>>12
Thread-3减法运算>>11
Thread-3减法运算>>10
Thread-3减法运算>>9
Thread-3减法运算>>8
Thread-3减法运算>>7
Thread-3减法运算>>6
Thread-3减法运算>>5
Thread-3减法运算>>4
Thread-3减法运算>>3
Thread-3减法运算>>2
Thread-3减法运算>>1
Thread-3减法运算>>0
Thread-2减法运算>>-1
Thread-2减法运算>>-2
Thread-2减法运算>>-3
Thread-2减法运算>>-4
Thread-2减法运算>>-5
Thread-2减法运算>>-6
Thread-2减法运算>>-7
Thread-2减法运算>>-8
Thread-2减法运算>>-9
Thread-2减法运算>>-10
Thread-2减法运算>>-11
Thread-2减法运算>>-12
Thread-2减法运算>>-13
Thread-2减法运算>>-14
Thread-2减法运算>>-15
Thread-2减法运算>>-16
Thread-2减法运算>>-17
Thread-2减法运算>>-18
Thread-2减法运算>>-19
Thread-2减法运算>>-20
Thread-1加法运算>>-19
Thread-1加法运算>>-18
Thread-1加法运算>>-17
Thread-1加法运算>>-16
Thread-1加法运算>>-15
Thread-1加法运算>>-14
Thread-1加法运算>>-13
Thread-1加法运算>>-12
Thread-1加法运算>>-11
Thread-1加法运算>>-10
Thread-1加法运算>>-9
Thread-1加法运算>>-8
Thread-1加法运算>>-7
Thread-1加法运算>>-6
Thread-1加法运算>>-5
Thread-1加法运算>>-4
Thread-1加法运算>>-3
Thread-1加法运算>>-2
Thread-1加法运算>>-1
Thread-1加法运算>>0



不加synchronized

运行结果如下: (分析得知数据共享读取写入错误)

Thread-0加法运算>>2
Thread-0加法运算>>3
Thread-0加法运算>>4
Thread-0加法运算>>5
Thread-0加法运算>>6
Thread-0加法运算>>7
Thread-0加法运算>>8
Thread-1加法运算>>2
Thread-1加法运算>>10
Thread-1加法运算>>11
Thread-0加法运算>>9
Thread-0加法运算>>12
Thread-1加法运算>>11
Thread-2减法运算>>10
Thread-1加法运算>>13
Thread-0加法运算>>12
Thread-3减法运算>>11
Thread-3减法运算>>13
Thread-3减法运算>>12
Thread-3减法运算>>11
Thread-3减法运算>>10
Thread-3减法运算>>9
Thread-3减法运算>>8
Thread-3减法运算>>7
Thread-3减法运算>>6
Thread-3减法运算>>5
Thread-3减法运算>>4
Thread-3减法运算>>3
Thread-0加法运算>>14
Thread-0加法运算>>3
Thread-0加法运算>>4
Thread-0加法运算>>5
Thread-0加法运算>>6
Thread-0加法运算>>7
Thread-0加法运算>>8
Thread-0加法运算>>9
Thread-0加法运算>>10
Thread-0加法运算>>11
Thread-1加法运算>>13
Thread-1加法运算>>12
Thread-2减法运算>>12
Thread-2减法运算>>12
Thread-2减法运算>>11
Thread-2减法运算>>10
Thread-2减法运算>>9
Thread-2减法运算>>8
Thread-2减法运算>>7
Thread-2减法运算>>6
Thread-2减法运算>>5
Thread-2减法运算>>4
Thread-2减法运算>>3
Thread-2减法运算>>2
Thread-2减法运算>>1
Thread-2减法运算>>0
Thread-1加法运算>>13
Thread-1加法运算>>0
Thread-1加法运算>>1
Thread-1加法运算>>2
Thread-1加法运算>>3
Thread-1加法运算>>4
Thread-1加法运算>>5
Thread-1加法运算>>6
Thread-1加法运算>>7
Thread-1加法运算>>8
Thread-1加法运算>>9
Thread-1加法运算>>10
Thread-1加法运算>>11
Thread-3减法运算>>2
Thread-3减法运算>>10
Thread-3减法运算>>9
Thread-3减法运算>>8
Thread-3减法运算>>7
Thread-3减法运算>>6
Thread-3减法运算>>5
Thread-3减法运算>>4
Thread-2减法运算>>-1
Thread-2减法运算>>3
Thread-2减法运算>>2
Thread-2减法运算>>1
Thread-2减法运算>>0




通过内部类来完成:


package com.saic.grape.controller;

public class TestInner {

    private int j=0;
    
    public synchronized void inc() {
        j++;
        System.out.println(Thread.currentThread().getName()+"加法运算"+j);
    }
    public synchronized void dec() {
        j--;
        System.out.println(Thread.currentThread().getName()+"减法运算"+j);
    }
    class Inc implements Runnable{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            for (int i = 0; i < 20; i++) {
                inc();
            }
        }
    }
    class Dec implements Runnable{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            for (int i = 0; i < 20; i++) {
                dec();
            }
        }
        
    }
    
    public static void main(String[] args) {
        TestInner test=new TestInner();
        Inc inc=test.new Inc();
        Thread thInc1=new Thread(inc);
        Thread thInc2=new Thread(inc);
        thInc1.start();
        thInc2.start();
        
        Dec dec=test.new Dec();
        Thread thDec1=new Thread(dec);
        Thread thDec2=new Thread(dec);
        thDec1.start();
        thDec2.start();
    }
    
}

运行结果:

Thread-0加法运算1
Thread-0加法运算2
Thread-0加法运算3
Thread-0加法运算4
Thread-0加法运算5
Thread-0加法运算6
Thread-0加法运算7
Thread-0加法运算8
Thread-0加法运算9
Thread-1加法运算10
Thread-0加法运算11
Thread-0加法运算12
Thread-0加法运算13
Thread-0加法运算14
Thread-0加法运算15
Thread-0加法运算16
Thread-0加法运算17
Thread-0加法运算18
Thread-0加法运算19
Thread-0加法运算20
Thread-0加法运算21
Thread-1加法运算22
Thread-1加法运算23
Thread-1加法运算24
Thread-1加法运算25
Thread-1加法运算26
Thread-1加法运算27
Thread-1加法运算28
Thread-1加法运算29
Thread-1加法运算30
Thread-1加法运算31
Thread-1加法运算32
Thread-1加法运算33
Thread-1加法运算34
Thread-1加法运算35
Thread-1加法运算36
Thread-1加法运算37
Thread-1加法运算38
Thread-1加法运算39
Thread-1加法运算40
Thread-2减法运算39
Thread-2减法运算38
Thread-2减法运算37
Thread-2减法运算36
Thread-2减法运算35
Thread-2减法运算34
Thread-2减法运算33
Thread-2减法运算32
Thread-2减法运算31
Thread-2减法运算30
Thread-2减法运算29
Thread-2减法运算28
Thread-2减法运算27
Thread-2减法运算26
Thread-2减法运算25
Thread-2减法运算24
Thread-2减法运算23
Thread-2减法运算22
Thread-2减法运算21
Thread-2减法运算20
Thread-3减法运算19
Thread-3减法运算18
Thread-3减法运算17
Thread-3减法运算16
Thread-3减法运算15
Thread-3减法运算14
Thread-3减法运算13
Thread-3减法运算12
Thread-3减法运算11
Thread-3减法运算10
Thread-3减法运算9
Thread-3减法运算8
Thread-3减法运算7
Thread-3减法运算6
Thread-3减法运算5
Thread-3减法运算4
Thread-3减法运算3
Thread-3减法运算2
Thread-3减法运算1
Thread-3减法运算0

不加synchronized关键字:(出现数据共享读写错误)


package com.saic.grape.controller;

public class TestInner {

    private int j=0;
    
    public  void inc() {
        j++;
        System.out.println(Thread.currentThread().getName()+"加法运算"+j);
    }
    public  void dec() {
        j--;
        System.out.println(Thread.currentThread().getName()+"减法运算"+j);
    }
    class Inc implements Runnable{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            for (int i = 0; i < 20; i++) {
                inc();
            }
        }
    }
    class Dec implements Runnable{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            for (int i = 0; i < 20; i++) {
                dec();
            }
        }
        
    }
    
    public static void main(String[] args) {
        TestInner test=new TestInner();
        Inc inc=test.new Inc();
        Thread thInc1=new Thread(inc);
        Thread thInc2=new Thread(inc);
        thInc1.start();
        thInc2.start();
        
        Dec dec=test.new Dec();
        Thread thDec1=new Thread(dec);
        Thread thDec2=new Thread(dec);
        thDec1.start();
        thDec2.start();
    }
    
}

运行结果如下:

Thread-0加法运算1
Thread-1加法运算2
Thread-0加法运算3
Thread-1加法运算4
Thread-0加法运算5
Thread-1加法运算6
Thread-0加法运算7
Thread-1加法运算8
Thread-0加法运算9
Thread-1加法运算10
Thread-0加法运算11
Thread-1加法运算12
Thread-0加法运算13
Thread-1加法运算14
Thread-0加法运算15
Thread-1加法运算16
Thread-1加法运算18
Thread-1加法运算19
Thread-0加法运算17
Thread-1加法运算20
Thread-0加法运算21
Thread-1加法运算22
Thread-1加法运算24
Thread-1加法运算25
Thread-0加法运算23
Thread-1加法运算26
Thread-0加法运算27
Thread-1加法运算28
Thread-0加法运算29
Thread-1加法运算30
Thread-0加法运算31
Thread-1加法运算32
Thread-0加法运算33
Thread-1加法运算34
Thread-1加法运算36
Thread-0加法运算35
Thread-0加法运算37
Thread-0加法运算38
Thread-0加法运算39
Thread-0加法运算40
Thread-2减法运算39
Thread-2减法运算38
Thread-2减法运算37
Thread-2减法运算36
Thread-2减法运算35
Thread-2减法运算34
Thread-2减法运算33
Thread-2减法运算32
Thread-2减法运算31
Thread-2减法运算30
Thread-2减法运算29
Thread-2减法运算28
Thread-2减法运算26
Thread-2减法运算25
Thread-2减法运算24
Thread-2减法运算23
Thread-3减法运算26
Thread-3减法运算22
Thread-3减法运算21
Thread-3减法运算20
Thread-3减法运算19
Thread-3减法运算18
Thread-3减法运算17
Thread-3减法运算16
Thread-3减法运算15
Thread-3减法运算14
Thread-3减法运算13
Thread-3减法运算12
Thread-3减法运算11
Thread-3减法运算10
Thread-3减法运算9
Thread-2减法运算7
Thread-3减法运算7
Thread-3减法运算6
Thread-3减法运算5
Thread-3减法运算4
Thread-3减法运算3
Thread-2减法运算2
Thread-2减法运算1
Thread-2减法运算0