版权声明:版权归 爱装逼的文艺小青年所有 https://blog.csdn.net/toyota_rav4/article/details/85210474
首先我们需要了解一下java中的内置内。
package com.demo4;
public class OuterClass {
private String username;
private String password;
class InnerClass {
private String age;
private String job;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public void print(){
System.out.println("username=" + username + " password=" + password);
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package com.demo4;
public class Run {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.setUsername("jack");
outerClass.setPassword("123456");
OuterClass.InnerClass innerClass = outerClass.new InnerClass();
innerClass.print();
}
}
运行结果:
username=jack password=123456
内置内同步的使用
package com.demo4;
public class OuterClass {
static class InnerClass {
public void methodA() {
try {
synchronized (new Object()) {
for (int i = 0; i < 10; i++) {
System.out.println("执行methodA线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(3000);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void methodB() {
try {
for (int i = 10; i < 20; i++) {
System.out.println("执行methodB线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.demo4;
public class Run {
public static void main(String[] args) {
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
innerClass.methodA();
}
},"A");
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
innerClass.methodB();
}
},"B");
threadA.start();
threadB.start();
}
}
运行结果:
执行methodA线程名:A ; i=0
执行methodB线程名:B ; i=10
执行methodB线程名:B ; i=11
执行methodB线程名:B ; i=12
执行methodB线程名:B ; i=13
执行methodA线程名:A ; i=1
执行methodB线程名:B ; i=14
执行methodB线程名:B ; i=15
执行methodB线程名:B ; i=16
执行methodA线程名:A ; i=2
执行methodB线程名:B ; i=17
执行methodB线程名:B ; i=18
执行methodB线程名:B ; i=19
执行methodA线程名:A ; i=3
执行methodA线程名:A ; i=4
执行methodA线程名:A ; i=5
执行methodA线程名:A ; i=6
执行methodA线程名:A ; i=7
执行methodA线程名:A ; i=8
执行methodA线程名:A ; i=9
由打印结果可知,由于A、B线程拿到的是不同的锁,所以执行起来是异步调用。如果想A、B同步执行的话,只需要将methodA同步。
package com.demo4;
public class OuterClass {
static class InnerClass {
public synchronized void methodA() {
try {
//synchronized (new Object()) {
for (int i = 0; i < 10; i++) {
System.out.println("执行methodA线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(3000);
}
//}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void methodB() {
try {
for (int i = 10; i < 20; i++) {
System.out.println("执行methodB线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
运行结果:
执行methodA线程名:A ; i=0
执行methodA线程名:A ; i=1
执行methodA线程名:A ; i=2
执行methodA线程名:A ; i=3
执行methodA线程名:A ; i=4
执行methodA线程名:A ; i=5
执行methodA线程名:A ; i=6
执行methodA线程名:A ; i=7
执行methodA线程名:A ; i=8
执行methodA线程名:A ; i=9
执行methodB线程名:B ; i=10
执行methodB线程名:B ; i=11
执行methodB线程名:B ; i=12
执行methodB线程名:B ; i=13
执行methodB线程名:B ; i=14
执行methodB线程名:B ; i=15
执行methodB线程名:B ; i=16
执行methodB线程名:B ; i=17
执行methodB线程名:B ; i=18
执行methodB线程名:B ; i=19
多个内置内 异步执行
package com.demo4;
public class OuterClass {
static class InnerClass {
public synchronized void methodA() {
try {
for (int i = 0; i < 10; i++) {
System.out.println("执行InnerClass中methodA线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(2000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class InnerClass2 {
public synchronized void methodB() {
try {
for (int i = 10; i < 20; i++) {
System.out.println("执行InnerClass2中methodB线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.demo4;
public class Run {
public static void main(String[] args) {
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
OuterClass.InnerClass2 innerClass2 = new OuterClass.InnerClass2();
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
innerClass.methodA();
}
},"A");
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
innerClass2.methodB();
}
},"B");
threadA.start();
threadB.start();
}
}
运行结果:
执行InnerClass2中methodB线程名:B ; i=10
执行InnerClass中methodA线程名:A ; i=0
执行InnerClass2中methodB线程名:B ; i=11
执行InnerClass2中methodB线程名:B ; i=12
执行InnerClass中methodA线程名:A ; i=1
执行InnerClass2中methodB线程名:B ; i=13
执行InnerClass2中methodB线程名:B ; i=14
执行InnerClass中methodA线程名:A ; i=2
执行InnerClass2中methodB线程名:B ; i=15
执行InnerClass中methodA线程名:A ; i=3
执行InnerClass2中methodB线程名:B ; i=16
执行InnerClass2中methodB线程名:B ; i=17
执行InnerClass中methodA线程名:A ; i=4
执行InnerClass2中methodB线程名:B ; i=18
执行InnerClass2中methodB线程名:B ; i=19
执行InnerClass中methodA线程名:A ; i=5
执行InnerClass中methodA线程名:A ; i=6
执行InnerClass中methodA线程名:A ; i=7
执行InnerClass中methodA线程名:A ; i=8
执行InnerClass中methodA线程名:A ; i=9
多个内置内之间的同步执行
package com.demo4;
public class OuterClass {
static class InnerClass {
public void methodA(InnerClass2 innerClass2) {
synchronized (innerClass2) {
try {
for (int i = 0; i < 10; i++) {
System.out.println("执行InnerClass中methodA线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(2000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
static class InnerClass2 {
public synchronized void methodB() {
try {
for (int i = 10; i < 20; i++) {
System.out.println("执行InnerClass2中methodB线程名:" + Thread.currentThread().getName()
+ " ; i=" + i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package com.demo4;
public class Run {
public static void main(String[] args) {
OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
OuterClass.InnerClass2 innerClass2 = new OuterClass.InnerClass2();
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
innerClass.methodA(innerClass2);
}
},"A");
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
innerClass2.methodB();
}
},"B");
threadA.start();
threadB.start();
}
}
运行结果:
执行InnerClass中methodA线程名:A ; i=0
执行InnerClass中methodA线程名:A ; i=1
执行InnerClass中methodA线程名:A ; i=2
执行InnerClass中methodA线程名:A ; i=3
执行InnerClass中methodA线程名:A ; i=4
执行InnerClass中methodA线程名:A ; i=5
执行InnerClass中methodA线程名:A ; i=6
执行InnerClass中methodA线程名:A ; i=7
执行InnerClass中methodA线程名:A ; i=8
执行InnerClass中methodA线程名:A ; i=9
执行InnerClass2中methodB线程名:B ; i=10
执行InnerClass2中methodB线程名:B ; i=11
执行InnerClass2中methodB线程名:B ; i=12
执行InnerClass2中methodB线程名:B ; i=13
执行InnerClass2中methodB线程名:B ; i=14
执行InnerClass2中methodB线程名:B ; i=15
执行InnerClass2中methodB线程名:B ; i=16
执行InnerClass2中methodB线程名:B ; i=17
执行InnerClass2中methodB线程名:B ; i=18
执行InnerClass2中methodB线程名:B ; i=19
扫描二维码关注公众号,回复:
4606571 查看本文章