Привет! Я реализовал свой код, как показано ниже, в двух фрагментах, но все же я не могу добиться синхронизации в потоках, так как мои методы синхронизированы, пока ни один поток не ожидает другого до завершения. не могли бы вы сообщить мне, какую ошибку я допустил в приведенном ниже фрагменте?
но когда я помещаю sleep в Thread между ними, он работает нормально, но это не лучший способ реализовать, поместив sleep в Thread
Вариант 1:
public class A{
public static void main(String args[]){
C c = new C();
ExecutorService executorService = Executors.newFixedThreadPool(10);
B t1 = new B(c);
for(int i = 1; i <=10; i++) {
executorService.submit(/*new B(c)*/t1);
}
executorService.shutdown();
try{
executorService.awaitTermination(Long.MAX_VALUE,TimeUnit.NANOSECONDS);
}catch(InterruptedException e){
System.out.println("Error while checking tread life: "+e);
}
}
}
public class B extends Thread{
C c;
static final Object lockObject = new Object();
public B(C c) {
this.c = c;
}
public void run(){
someProcess();
}
synchronized public void someProcess(){
String something = c.C();
if(something == null || "".equalsIgnoreCase(something)){
c.A();
}else{
c.B();
}
}
}
public class C {
synchronized public void method A(){
//insert the recods
}
synchronized public void method B(){
//update the records
}
synchronized public String method C(){
// searching a record to get it's id if it exist
return something;
}
}
Вариант 2:
public class A {
public static void main(String args[]) {
C c = new C();
ExecutorService executorService = Executors.newFixedThreadPool(10);
B t1 = new B(c);
for(int i = 1; i <=10; i++) {
executorService.submit(/*new B(c)*/t1);
}
if(executorService !=null) {
executorService.shutdown();
try {
executorService.awaitTermination (Long.MAX_VALUE,TimeUnit.NANOSECONDS);
}catch(InterruptedException e) {
System.out.println("Error while checking tread life: "+e);
}
}
}
}
public class B extends Thread {
C c;
static final Object lockObject = new Object();
public B(C c) {
this.c = c;
}
public void run() {
someProcess();
}
public void someProcess() {
synchronized(this) {
String something = c.C();
if(something == null || "".equalsIgnoreCase(something)) {
c.A();
}else{
c.B();
}
}
}
}
public class C {
synchronized public void method A() {
//insert the recods
}
synchronized public void method B() {
//update the records
}
synchronized public String method C() {
// searching a record to get it's id if it exist
return something;
}
}
Вариант 3:
public class A {
public static void main(String args[]) {
C c = new C();
ExecutorService executorService = Executors.newFixedThreadPool(10);
B t1 = new B(c);
for(int i = 1; i <=10; i++) {
executorService.submit(/*new B(c)*/t1);
}
if(executorService !=null) {
executorService.shutdown();
try {
executorService.awaitTermination (Long.MAX_VALUE,TimeUnit.NANOSECONDS);
}catch(InterruptedException e) {
System.out.println("Error while checking tread life: "+e);
}
}
}
}
public class B extends Thread {
C c;
static final Object lockObject = new Object();
public B(C c) {
this.c = c;
}
public void run() {
someProcess();
}
public void someProcess() {
synchronized(this) {
String something = c.C();
if(something == null || "".equalsIgnoreCase(something)) {
c.A();
}else{
c.B();
}
}
}
}
public class C {
public void method A() {
synchronized(this) {
//insert the recods
}
}
public void method B() {
synchronized(this) {
//update the records
}
}
public String method C() {
synchronized(this) {
// searching a record to get it's id if it exist
return something;
}
}
}
Вариант 4:
public class A {
public static void main(String args[]) {
C c = new C();
ExecutorService executorService = Executors.newFixedThreadPool(10);
B t1 = new B(c);
for(int i = 1; i <=10; i++) {
executorService.submit(/*new B(c)*/t1);
}
if(executorService !=null) {
executorService.shutdown();
try {
executorService.awaitTermination (Long.MAX_VALUE,TimeUnit.NANOSECONDS);
}catch(InterruptedException e) {
System.out.println("Error while checking tread life: "+e);
}
}
}
}
public class B extends Thread {
C c;
static final Object lockObject = new Object();
public B(C c) {
this.c = c;
}
public void run() {
someProcess();
}
public void someProcess() {
synchronized(lockObject) {
String something = c.C(lockObject);
if(something == null || "".equalsIgnoreCase(something)) {
c.A(lockObject);
}else{
c.B(lockObject);
}
}
}
}
public class C {
public void method A(Object lockObject) {
synchronized(lockObject) {
//insert the recods
}
}
public void method B(Object lockObject) {
synchronized(lockObject) {
//update the records
}
}
public String method C(Object lockObject) {
synchronized(lockObject) {
// searching a record to get it's id if it exist
return something;
}
}
}