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 = 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 = 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=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